www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Src/ExtPaintManager.cpp
//Download by http://www.NewXing.com // This is part of the Professional User Interface Suite library. // Copyright (C) 2001-2004 FOSS Software, Inc. // All rights reserved. // // http://www.prof-uis.com // http://www.fossware.com // mailto:foss@fossware.com // // This source code can be used, modified and redistributed // under the terms of the license agreement that is included // in the Professional User Interface Suite package. // // Warranties and Disclaimers: // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES, // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA, // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. #include "StdAfx.h" #if (defined __PROF_UIS_BUILTIN_MULTIMON_STUB) #define COMPILE_MULTIMON_STUBS #endif // __PROF_UIS_BUILTIN_MULTIMON_STUB // disable warning 4706 #pragma warning( push ) #pragma warning ( disable : 4706 ) #include <multimon.h> // rollback warning 4706 #pragma warning( pop ) #if _MFC_VER < 0x700 #include <../src/AfxImpl.h> #else #include <../src/mfc/AfxImpl.h> #endif #if (!defined __EXT_PAINT_MANAGER_H) #include <ExtPaintManager.h> #endif #if (!defined __EXT_MEMORY_DC_H) #include <../Src/ExtMemoryDC.h> #endif #if (!defined __EXT_POPUP_MENU_WND_H) #include <ExtPopupMenuWnd.h> #endif #if (!defined __EXT_MENUCONTROLBAR_H) #include <ExtMenuControlBar.h> #endif #if (!defined __EXTDOCKBAR_H) #include <../Src/ExtDockBar.h> #endif #if (!defined __EXT_STATUSCONTROLBAR_H) #include <ExtStatusControlBar.h> #endif #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS) #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H) #include "ExtControlBarTabbedFeatures.h" #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H #endif #if( !defined __EXTMINIDOCKFRAMEWND_H) #include "ExtMiniDockFrameWnd.h" #endif #if (!defined __EXT_MFC_NO_TAB_CTRL) #if (!defined __EXT_TABWND_H) #include <ExtTabWnd.h> #endif #endif // (!defined __EXT_MFC_NO_TAB_CTRL) #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL) #if (!defined __EXTSHORTCUTLISTWND_H) #include <ExtShortcutListWnd.h> #endif #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL) #include <math.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE( CExtPaintManager, CObject ) IMPLEMENT_DYNCREATE( CExtPaintManagerXP, CExtPaintManager ) IMPLEMENT_DYNCREATE( CExtPaintManagerOffice2003, CExtPaintManagerXP ) //#define __TRACE_PAINT_SESSIONS #define __ExtMfc_CXTEXTMARGIN (-1) // 1 #define __ExtMfc_CYTEXTMARGIN (0) // 1 CExtPaintManager::CExtPaintManagerAutoPtr g_PaintManager; CExtPaintManager::CExtPaintManagerAutoPtr:: CExtPaintManagerAutoPtr() : m_pPaintManager( NULL ) , m_bHaveScrollLines( false ) , m_uCachedScrollLines( 0 ) , m_hInstUserExTheme( NULL ) , m_bUxApiInitPassed( false ) , m_bUxValidColorsExtracted( false ) , m_bUxAppThemed( false ) , m_bUxUseIfAvailOnWinXpOrLater( true ) , m_strOsVer( _T("Unknown") ) , m_bIsWin32s( false ) , m_bIsWin9x( false ) , m_bIsWin98( false ) , m_bIsWin98orLater( false ) , m_bIsWinNT( false ) , m_bIsWinNT4( false ) , m_bIsWin2000( false ) , m_bIsWinXP( false ) , m_bIsWinNT4orLater( false ) , m_bIsWin2000orLater( false ) , m_bIsWinXPorLater( false ) { #ifdef WM_THEMECHANGED ASSERT( __ExtMfc_WM_THEMECHANGED == WM_THEMECHANGED ); #endif // WM_THEMECHANGED memset((char *)&m_osVerData,0,sizeof(OSVERSIONINFO)); m_osVerData.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); CExtSafeString sTmp( _T("") ); VERIFY( ::GetVersionEx(&m_osVerData) ); switch(m_osVerData.dwPlatformId) { case VER_PLATFORM_WIN32s: m_bIsWin32s = true; sTmp = _T("Win32s"); break; case VER_PLATFORM_WIN32_WINDOWS: { m_bIsWin9x = true; m_bIsWin98orLater = (m_osVerData.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && ( (m_osVerData.dwMajorVersion > 4) || ( (m_osVerData.dwMajorVersion == 4) && (m_osVerData.dwMinorVersion > 0) ) ); sTmp = _T("Windows "); if(m_bIsWin98orLater) { if((m_osVerData.dwMajorVersion == 4) && (m_osVerData.dwMinorVersion > 0)) { m_bIsWin98 = true; sTmp += _T("98"); } else sTmp += _T("98 or later"); } else sTmp += _T("95"); } break; case VER_PLATFORM_WIN32_NT: m_bIsWinNT = true; if( m_osVerData.dwMajorVersion == 5 ) { if( m_osVerData.dwMinorVersion == 0 ) { m_bIsWin2000 = true; sTmp = _T("Windows 2000"); } else if( m_osVerData.dwMinorVersion == 1 ) { m_bIsWinXP = true; sTmp = _T("Windows XP"); } } else if( m_osVerData.dwMajorVersion == 4 ) { m_bIsWinNT4 = true; sTmp = _T("Windows NT"); } else sTmp = _T("Windows NT"); if( m_osVerData.dwMajorVersion >= 4 ) m_bIsWinNT4orLater = true; if( m_osVerData.dwMajorVersion >= 5 ) { m_bIsWin2000orLater = true; if( ! ( m_osVerData.dwMajorVersion == 5 && m_osVerData.dwMinorVersion == 0 ) ) m_bIsWinXPorLater = true; } break; default: break; } // switch(m_osVerData.dwPlatformId) m_strOsVer.Format( _T("%s v.%lu.%lu (build %lu) %s"), sTmp, m_osVerData.dwMajorVersion, m_osVerData.dwMinorVersion, m_osVerData.dwBuildNumber, m_osVerData.szCSDVersion ); // init uxtheme.dll data InitUserExApi(); VERIFY( InitPaintManagerInstance() ); } void CExtPaintManager::CExtPaintManagerAutoPtr::InitUserExApi() { // init uxtheme.dll data if( m_bUxApiInitPassed && m_bUxValidColorsExtracted ) return; m_bUxValidColorsExtracted = false; m_bUxAppThemed = false; struct { FARPROC * m_pFarProc; LPCSTR m_strProcName; }arrUserExApi[] = { { (FARPROC*)&m_pUxApi_OpenThemeData, "OpenThemeData" }, { (FARPROC*)&m_pUxApi_CloseThemeData, "CloseThemeData" }, { (FARPROC*)&m_pUxApi_DrawThemeBackground, "DrawThemeBackground" }, { (FARPROC*)&m_pUxApi_DrawThemeText, "DrawThemeText" }, { (FARPROC*)&m_pUxApi_GetThemeBackgroundContentRect, "GetThemeBackgroundContentRect" }, { (FARPROC*)&m_pUxApi_GetThemeBackgroundExtent, "GetThemeBackgroundExtent" }, { (FARPROC*)&m_pUxApi_GetThemePartSize, "GetThemePartSize" }, { (FARPROC*)&m_pUxApi_GetThemeTextExtent, "GetThemeTextExtent" }, { (FARPROC*)&m_pUxApi_GetThemeTextMetrics, "GetThemeTextMetrics" }, { (FARPROC*)&m_pUxApi_GetThemeBackgroundRegion, "GetThemeBackgroundRegion" }, { (FARPROC*)&m_pUxApi_HitTestThemeBackground, "HitTestThemeBackground" }, { (FARPROC*)&m_pUxApi_DrawThemeEdge, "DrawThemeEdge" }, { (FARPROC*)&m_pUxApi_DrawThemeIcon, "DrawThemeIcon" }, { (FARPROC*)&m_pUxApi_IsThemePartDefined, "IsThemePartDefined" }, { (FARPROC*)&m_pUxApi_IsThemeBackgroundPartiallyTransparent, "IsThemeBackgroundPartiallyTransparent" }, { (FARPROC*)&m_pUxApi_GetThemeColor, "GetThemeColor" }, { (FARPROC*)&m_pUxApi_GetThemeMetric, "GetThemeMetric" }, { (FARPROC*)&m_pUxApi_GetThemeString, "GetThemeString" }, { (FARPROC*)&m_pUxApi_GetThemeBool, "GetThemeBool" }, { (FARPROC*)&m_pUxApi_GetThemeInt, "GetThemeInt" }, { (FARPROC*)&m_pUxApi_GetThemeEnumValue, "GetThemeEnumValue" }, { (FARPROC*)&m_pUxApi_GetThemePosition, "GetThemePosition" }, { (FARPROC*)&m_pUxApi_GetThemeFont, "GetThemeFont" }, { (FARPROC*)&m_pUxApi_GetThemeRect, "GetThemeRect" }, { (FARPROC*)&m_pUxApi_GetThemeMargins, "GetThemeMargins" }, { (FARPROC*)&m_pUxApi_GetThemeIntList, "GetThemeIntList" }, { (FARPROC*)&m_pUxApi_GetThemePropertyOrigin, "GetThemePropertyOrigin" }, { (FARPROC*)&m_pUxApi_SetWindowTheme, "SetWindowTheme" }, { (FARPROC*)&m_pUxApi_GetThemeFilename, "GetThemeFilename" }, { (FARPROC*)&m_pUxApi_GetThemeSysColor, "GetThemeSysColor" }, { (FARPROC*)&m_pUxApi_GetThemeSysColorBrush, "GetThemeSysColorBrush" }, { (FARPROC*)&m_pUxApi_GetThemeSysBool, "GetThemeSysBool" }, { (FARPROC*)&m_pUxApi_GetThemeSysSize, "GetThemeSysSize" }, { (FARPROC*)&m_pUxApi_GetThemeSysFont, "GetThemeSysFont" }, { (FARPROC*)&m_pUxApi_GetThemeSysString, "GetThemeSysString" }, { (FARPROC*)&m_pUxApi_GetThemeSysInt, "GetThemeSysInt" }, { (FARPROC*)&m_pUxApi_IsThemeActive, "IsThemeActive" }, { (FARPROC*)&m_pUxApi_IsAppThemed, "IsAppThemed" }, { (FARPROC*)&m_pUxApi_GetWindowTheme, "GetWindowTheme" }, { (FARPROC*)&m_pUxApi_EnableThemeDialogTexture, "EnableThemeDialogTexture" }, { (FARPROC*)&m_pUxApi_IsThemeDialogTextureEnabled, "IsThemeDialogTextureEnabled" }, { (FARPROC*)&m_pUxApi_GetThemeAppProperties, "GetThemeAppProperties" }, { (FARPROC*)&m_pUxApi_SetThemeAppProperties, "SetThemeAppProperties" }, { (FARPROC*)&m_pUxApi_GetCurrentThemeName, "GetCurrentThemeName" }, { (FARPROC*)&m_pUxApi_GetThemeDocumentationProperty, "GetThemeDocumentationProperty" }, { (FARPROC*)&m_pUxApi_DrawThemeParentBackground, "DrawThemeParentBackground" }, { (FARPROC*)&m_pUxApi_EnableTheming, "EnableTheming" }, { (FARPROC*)&m_pUxApi_DrawThemeBackgroundEx, "DrawThemeBackgroundEx" }, }; if( m_hInstUserExTheme == NULL ) { m_hInstUserExTheme = ::GetModuleHandle( _T("uxtheme.dll") ); if( m_hInstUserExTheme == NULL ) m_hInstUserExTheme = ::LoadLibrary( _T("uxtheme.dll") ); } // if( m_hInstUserExTheme == NULL ) int nApiAvailCount = 0; for( int nFunc = 0; nFunc < ( sizeof(arrUserExApi)/sizeof(arrUserExApi[0]) ); nFunc++ ) { FARPROC pFarProc = NULL; if( m_hInstUserExTheme != NULL ) { pFarProc = ::GetProcAddress( m_hInstUserExTheme, arrUserExApi[nFunc].m_strProcName ); //ASSERT( pFarProc != NULL ); } // if( m_hInstUserExTheme != NULL ) if( pFarProc != NULL ) nApiAvailCount ++; *(arrUserExApi[nFunc].m_pFarProc) = pFarProc; } if( m_hInstUserExTheme != NULL && nApiAvailCount > 0 && m_pUxApi_IsAppThemed != NULL && m_pUxApi_OpenThemeData != NULL && m_pUxApi_CloseThemeData != NULL && m_pUxApi_GetThemeColor != NULL ) { m_bUxApiInitPassed = true; m_bUxAppThemed = m_pUxApi_IsAppThemed() ? true : false; HWND hWndDesktop = ::GetDesktopWindow(); ASSERT( hWndDesktop != NULL ); EXT_UX_HTHEME hThemeTaskBand = m_pUxApi_OpenThemeData( hWndDesktop, L"taskband" ); if( hThemeTaskBand != NULL ) { if( // m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_EDGELIGHTCOLOR,&m_clrUxTaskBandEdgeLightColor) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_EDGEHIGHLIGHTCOLOR,&m_clrUxTaskBandEdgeHighLightColor) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_EDGESHADOWCOLOR,&m_clrUxTaskBandEdgeShadowColor) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_EDGEDKSHADOWCOLOR,&m_clrUxTaskBandEdgeDkShadowColor) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_EDGEFILLCOLOR,&m_clrUxTaskBandEdgeFillColor) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_FILLCOLORHINT,&m_clrUxTaskBandFillColorHint) == S_OK // && m_pUxApi_GetThemeColor(hThemeTaskBand,TDP_FLASHBUTTON,0,TMT_ACCENTCOLORHINT,&m_clrUxTaskBandAccentColorHint) == S_OK m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EDC /* TMT_EDGELIGHTCOLOR */, &m_clrUxTaskBandEdgeLightColor ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EDD /* TMT_EDGEHIGHLIGHTCOLOR */, &m_clrUxTaskBandEdgeHighLightColor ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EDE /* TMT_EDGESHADOWCOLOR */, &m_clrUxTaskBandEdgeShadowColor ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EDF /* TMT_EDGEDKSHADOWCOLOR */, &m_clrUxTaskBandEdgeDkShadowColor ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EE0 /* TMT_EDGEFILLCOLOR */, &m_clrUxTaskBandEdgeFillColor ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EED /* TMT_FILLCOLORHINT */, &m_clrUxTaskBandFillColorHint ) == S_OK && m_pUxApi_GetThemeColor( hThemeTaskBand, 0x02 /* TDP_FLASHBUTTON */, 0, 0x0EEF /* TMT_ACCENTCOLORHINT */, &m_clrUxTaskBandAccentColorHint ) == S_OK ) m_bUxValidColorsExtracted = true; m_pUxApi_CloseThemeData( hThemeTaskBand ); } // if( hThemeTaskBand != NULL ) } // if( m_hInstUserExTheme != NULL ... } CExtPaintManager::CExtPaintManagerAutoPtr:: ~CExtPaintManagerAutoPtr() { if( m_pPaintManager ) delete m_pPaintManager; m_pPaintManager = NULL; } bool CExtPaintManager::CExtPaintManagerAutoPtr:: InitPaintManagerInstance() { if( m_pPaintManager != NULL ) return true; return InstallPaintManager( (CExtPaintManager *)NULL ); } CExtPaintManager * CExtPaintManager::CExtPaintManagerAutoPtr:: operator->() { // InitPaintManagerInstance(); ASSERT( m_pPaintManager != NULL ); return m_pPaintManager; } bool CExtPaintManager::CExtPaintManagerAutoPtr:: InstallPaintManager( CExtPaintManager * pPaintManager ) { if( m_pPaintManager != NULL ) { if( pPaintManager == m_pPaintManager ) return true; if( m_pPaintManager != NULL ) { delete m_pPaintManager; m_pPaintManager = NULL; } } // if( m_pPaintManager != NULL ) if( pPaintManager != NULL ) m_pPaintManager = pPaintManager; else { m_pPaintManager = new __DEFAULT_PAINT_MANAGER_CLASS; if( !m_pPaintManager-> IsKindOf( RUNTIME_CLASS( CExtPaintManager ) ) ) { ASSERT( FALSE ); return false; } } m_pPaintManager->SyncSysColors(); m_pPaintManager->InitTranslatedColors(); return true; } bool CExtPaintManager::CExtPaintManagerAutoPtr:: InstallPaintManager( CRuntimeClass * pRtcPaintManager ) { if( pRtcPaintManager == NULL ) return InitPaintManagerInstance(); CObject* pObj = pRtcPaintManager->CreateObject(); if( pObj == NULL ) { ASSERT( FALSE ); return false; } ASSERT_VALID( pObj ); CExtPaintManager * pPaintManager = DYNAMIC_DOWNCAST(CExtPaintManager,pObj); if( pPaintManager == NULL ) { delete pObj; ASSERT( FALSE ); return false; } return InstallPaintManager( pPaintManager ); } UINT CExtPaintManager::CExtPaintManagerAutoPtr::GetMouseWheelScrollLines() { if( m_bHaveScrollLines ) return m_uCachedScrollLines; m_bHaveScrollLines = true; m_uCachedScrollLines = 3; #if _MFC_VER < 0x700 if( !afxData.bWin4 ) { HKEY hKey; if( ::RegOpenKeyEx( HKEY_CURRENT_USER, _T("Control Panel\\Desktop"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS ) { TCHAR szData[256]; DWORD dwKeyDataType; DWORD dwDataBufSize = _countof(szData); if( RegQueryValueEx( hKey, _T("WheelScrollLines"), NULL, &dwKeyDataType, (LPBYTE) &szData, &dwDataBufSize ) == ERROR_SUCCESS ) { m_uCachedScrollLines = _tcstoul( szData, NULL, 10 ); } RegCloseKey(hKey); } } else #endif // _MFC_VER < 0x700 if( !afxData.bWin95 ) { ::SystemParametersInfo( SPI_GETWHEELSCROLLLINES, 0, &m_uCachedScrollLines, 0 ); } return m_uCachedScrollLines; } bool CExtPaintManager::CExtPaintManagerAutoPtr::IsWndUpdateSource( CWnd * pWndNotifySrc ) { ASSERT_VALID( pWndNotifySrc ); ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) ); ASSERT( m_pPaintManager != NULL ); if( pWndNotifySrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) ) return true; CFrameWnd * pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndNotifySrc ); if( pFrame == NULL ) pFrame = pWndNotifySrc->GetParentFrame(); if( pFrame == NULL ) return true; if( pFrame->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd)) ) pFrame = pFrame->GetParentFrame(); if( pFrame == NULL || pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) ) return true; CWnd * pWnd = pFrame->GetControlBar( AFX_IDW_STATUS_BAR ); if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_TOP ); if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_BOTTOM ); if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_LEFT ); if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_RIGHT ); if( pWnd != NULL && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } #if (!defined __EXT_MFC_NO_TABMDI_CTRL) for( pWnd = pFrame->GetWindow(GW_CHILD); pWnd != NULL; pWnd = pWnd->GetWindow(GW_HWNDNEXT) ) { if( pWnd->IsKindOf(RUNTIME_CLASS(CExtTabMdiWnd)) ) { if( pWnd == pWndNotifySrc ) return true; return false; } } #endif // if (!defined __EXT_MFC_NO_TABMDI_CTRL) return true; } void CExtPaintManager::CExtPaintManagerAutoPtr::OnSysColorChange( CWnd * pWndNotifySrc ) { ASSERT_VALID( pWndNotifySrc ); ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) ); ASSERT( m_pPaintManager != NULL ); if( !IsWndUpdateSource(pWndNotifySrc) ) return; m_pPaintManager->OnSysColorChange(); } void CExtPaintManager::CExtPaintManagerAutoPtr::OnSettingChange( CWnd * pWndNotifySrc, UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection ) { ASSERT_VALID( pWndNotifySrc ); ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) ); ASSERT( m_pPaintManager != NULL ); if( !IsWndUpdateSource(pWndNotifySrc) ) return; m_bHaveScrollLines = false; m_pPaintManager->OnSettingChange( uFlags, lpszSection ); } void CExtPaintManager::CExtPaintManagerAutoPtr::OnDisplayChange( CWnd * pWndNotifySrc, INT nDepthBPP, CPoint ptSizes ) { ASSERT_VALID( pWndNotifySrc ); ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) ); ASSERT( m_pPaintManager != NULL ); if( !IsWndUpdateSource(pWndNotifySrc) ) return; m_bHaveScrollLines = false; m_pPaintManager->OnDisplayChange( nDepthBPP, ptSizes ); } void CExtPaintManager::CExtPaintManagerAutoPtr::OnThemeChanged( CWnd * pWndNotifySrc, WPARAM wParam, LPARAM lParam ) { ASSERT_VALID( pWndNotifySrc ); ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) ); ASSERT( m_pPaintManager != NULL ); if( !IsWndUpdateSource(pWndNotifySrc) ) return; m_bHaveScrollLines = false; m_pPaintManager->OnThemeChanged( wParam, lParam ); } CExtPaintManager::CExtPaintManager() : m_bUseTahomaFont( true ) { ASSERT( this != NULL ); m_DSS_DISABLED_style = DSS_DISABLED; /**/ #define __3D_COLOR_DEPTH_R 7 #define __3D_COLOR_DEPTH_G 6 #define __3D_COLOR_DEPTH_B 6 struct { LOGPALETTE LogPalette; PALETTEENTRY PalEntry[ (__3D_COLOR_DEPTH_R*__3D_COLOR_DEPTH_G*__3D_COLOR_DEPTH_B) ]; } pal; LOGPALETTE * pLogPalette = (LOGPALETTE*) &pal; pLogPalette->palVersion = 0x300; pLogPalette->palNumEntries = (WORD)(__3D_COLOR_DEPTH_R*__3D_COLOR_DEPTH_G*__3D_COLOR_DEPTH_B); int i = 0; for( int nX = 0; nX < __3D_COLOR_DEPTH_R; nX++ ) { for( int nY = 0; nY < __3D_COLOR_DEPTH_G; nY++ ) { for( int nZ = 0; nZ < __3D_COLOR_DEPTH_B; nZ++ ) { pLogPalette->palPalEntry[i].peRed = BYTE( (nX*255)/(__3D_COLOR_DEPTH_R-1) ); pLogPalette->palPalEntry[i].peGreen = BYTE( (nY*255)/(__3D_COLOR_DEPTH_G-1) ); pLogPalette->palPalEntry[i].peBlue = BYTE( (nZ*255)/(__3D_COLOR_DEPTH_B-1) ); pLogPalette->palPalEntry[i].peFlags = 0; i++; } } } VERIFY( m_PaletteWide.CreatePalette(pLogPalette) ); /**/ } CExtPaintManager::~CExtPaintManager() { ASSERT( this != NULL ); m_colors.RemoveAll(); m_brushes.RemoveAll(); CachedDcFreeAll(); } CExtPaintManagerXP::CExtPaintManagerXP() : m_bEnabledHoverIconShadows( true ) , m_bHelperXpStyle8BitBarRect( true ) , m_bExpBtnSwapVGlyphs( false ) , m_pGlyphTbEpBtnH0( &g_glyph_btn_expand_bottom ) , m_pGlyphTbEpBtnH1( &g_glyph_btn_expand_right2 ) , m_pGlyphTbEpBtnV0( &g_glyph_btn_expand_left ) , m_pGlyphTbEpBtnV1( &g_glyph_btn_expand_bottom2 ) , m_nIdxClrMlaNormLeft( -1 ) , m_nIdxClrMlaNormRight( -1 ) , m_nIdxClrMlaRarelyLeft( -1 ) , m_nIdxClrMlaRarelyRight( -1 ) , m_nIdxClrBtnHoverLeft( -1 ) , m_nIdxClrBtnHoverRight( -1 ) , m_nIdxClrBtnPressedLeft( -1 ) , m_nIdxClrBtnPressedRight( -1 ) , m_nIdxClrBtnHovPresLeft( -1 ) , m_nIdxClrBtnHovPresRight( -1 ) { } CExtPaintManagerXP::~CExtPaintManagerXP() { } CExtPaintManagerOffice2003::CExtPaintManagerOffice2003() : m_sizeToolBarRgnRounders( 4, 4 ) , m_sizeMenuExpBtnCircle( 16, 16 ) , m_nIdxClrTbFillMargin( -1 ) { m_bEnabledHoverIconShadows = false; m_bHelperXpStyle8BitBarRect = false; m_bExpBtnSwapVGlyphs = true; m_pGlyphTbEpBtnH0 = &g_glyph_btn_expand_bottom_2003; m_pGlyphTbEpBtnH1 = &g_glyph_btn_expand_right2_2003; m_pGlyphTbEpBtnV0 = &g_glyph_btn_expand_right_2003; m_pGlyphTbEpBtnV1 = &g_glyph_btn_expand_bottom2_2003; m_nIdxClrMlaNormLeft = _2003CLR_MLA_NORM_LEFT; m_nIdxClrMlaNormRight = _2003CLR_MLA_NORM_RIGHT; m_nIdxClrMlaRarelyLeft = _2003CLR_MLA_RARELY_LEFT; m_nIdxClrMlaRarelyRight = _2003CLR_MLA_RARELY_RIGHT; POINT arrMenuExpBtnCirclePoints[] = { { 4, 0 }, { 11, 0 }, { 15, 4 }, { 15, 11 }, { 11, 15 }, { 4, 15 }, { 0, 11 }, { 0, 4 }, }; VERIFY( m_rgnMenuExpBtnCircle.CreatePolygonRgn( arrMenuExpBtnCirclePoints, sizeof(arrMenuExpBtnCirclePoints)/sizeof(arrMenuExpBtnCirclePoints[0]), ALTERNATE ) ); } CExtPaintManagerOffice2003::~CExtPaintManagerOffice2003() { } CDC & CExtPaintManager::CachedDcGet( HGDIOBJ hBmp, INT nIdx // = 0 ) { #ifdef __TRACE_PAINT_SESSIONS TRACE1( " PAINT_SESSION: DC %d\n", nIdx ); #endif // __TRACE_PAINT_SESSIONS ASSERT( hBmp != NULL ); ASSERT( 0 <= nIdx && nIdx < (sizeof(m_arrSurfaceCache)/sizeof(m_arrSurfaceCache[0])) ); return m_arrSurfaceCache[nIdx].Alloc( hBmp ); } void CExtPaintManager::CachedDcFreeAll() { for( INT nIdx = 0; nIdx < (sizeof(m_arrSurfaceCache)/sizeof(m_arrSurfaceCache[0])); nIdx++ ) { m_arrSurfaceCache[nIdx].Free(); } } bool CExtPaintManager::glyph_t:: stat_DefGlyphRgnTransparencyFunc( const glyph_t & _glyph, int x, int y, UINT nColor, LPVOID lpCoockie ) { _glyph; x; y; lpCoockie; return (nColor == 0) ? true : false; } void CExtPaintManager::stat_PassPaintMessages( bool bPassNcPaint, // = true bool bPassEraseBkgnd, // = true bool bPassPaint // = true ) { MSG msg; if( bPassNcPaint ) { while( ::PeekMessage( &msg, NULL, WM_NCPAINT, WM_NCPAINT, PM_NOREMOVE ) ) { if( ! ::GetMessage( &msg, NULL, WM_NCPAINT, WM_NCPAINT ) ) break; ::DispatchMessage( &msg ); } // while( ::PeekMessage( &msg, NULL, WM_NCPAINT, WM_NCPAINT, PM_NOREMOVE ) ) } // if( bPassNcPaint ) if( bPassEraseBkgnd ) { while( ::PeekMessage( &msg, NULL, WM_ERASEBKGND, WM_ERASEBKGND, PM_NOREMOVE ) ) { if( ! ::GetMessage( &msg, NULL, WM_ERASEBKGND, WM_ERASEBKGND ) ) break; ::DispatchMessage( &msg ); } // while( ::PeekMessage( &msg, NULL, WM_ERASEBKGND, WM_ERASEBKGND, PM_NOREMOVE ) ) } // if( bPassEraseBkgnd ) if( bPassPaint ) { while( ::PeekMessage( &msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) { if( ! ::GetMessage( &msg, NULL, WM_PAINT, WM_PAINT ) ) break; ::DispatchMessage( &msg ); } // while( ::PeekMessage( &msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE ) ) } // if( bPassPaint ) } bool CExtPaintManager::stat_ResizeBitmap( CBitmap & bmpSrc, CSize _size, CBrush & brushFill ) { ASSERT( bmpSrc.GetSafeHandle() != NULL ); CDC dcSrc, dcDst; CBitmap * pBmpOldSrc, *pBmpOldDst, bmpNew; { // block if( (! dcSrc.CreateCompatibleDC( NULL ) ) || (! dcDst.CreateCompatibleDC( NULL ) ) ) { ASSERT( FALSE ); return false; } pBmpOldSrc = dcSrc.SelectObject( &bmpSrc ); if( !bmpNew.CreateCompatibleBitmap( &dcSrc, _size.cx, _size.cy ) ) { ASSERT( FALSE ); dcSrc.SelectObject( pBmpOldSrc ); return false; } pBmpOldDst = dcSrc.SelectObject( &bmpNew ); } // block CRect rcFill( 0, 0, _size.cx, _size.cy ); dcDst.FillRect( &rcFill, &brushFill ); VERIFY( dcDst.BitBlt( 0, 0, _size.cx, _size.cy, &dcSrc, 0, 0, SRCCOPY ) ); dcSrc.SelectObject( pBmpOldSrc ); dcDst.SelectObject( pBmpOldDst ); bmpSrc.DeleteObject(); bmpSrc.Attach( bmpNew.Detach() ); return true; } HICON CExtPaintManager::stat_HBITMAP2HICON( HBITMAP hBmpSrc, COLORREF clrTransparent, const RECT * pRcPart, // = NULL bool bReplaceSysColors // = true ) { if( hBmpSrc == NULL ) { ASSERT( FALSE ); return NULL; } BITMAP bmpDescription; ::memset( &bmpDescription, 0, sizeof(BITMAP) ); ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpDescription ); ASSERT( bmpDescription.bmWidth > 0 && bmpDescription.bmHeight > 0 ); CImageList _il; if( !_il.Create( bmpDescription.bmWidth, bmpDescription.bmHeight, ILC_COLOR32|ILC_MASK, 0, 1 ) ) { ASSERT( FALSE ); return NULL; } COLORREF * pSurface = NULL; HBITMAP hBmpExtracted = stat_CloneBitmap( hBmpSrc, pRcPart, &pSurface ); if( hBmpExtracted == NULL || pSurface == NULL ) { ASSERT( FALSE ); return NULL; } CBitmap bmpExtracted; bmpExtracted.Attach( hBmpExtracted ); if( bReplaceSysColors ) { COLORREF quadClrTransparent = RGB( GetBValue(clrTransparent), GetGValue(clrTransparent), GetRValue(clrTransparent) ); struct { COLORREF m_quadClrSrc; COLORREF m_quadClrDst; INT m_nDstSysColorIdx; bool m_bReplace; } _repl_arr[] = { { RGB(128,128,128), RGB(0,0,0), COLOR_3DSHADOW, true }, { RGB(192,192,192), RGB(0,0,0), COLOR_3DFACE, true }, { RGB(223,223,223), RGB(0,0,0), COLOR_3DLIGHT, true }, }; const int nReplCount = sizeof(_repl_arr) / sizeof(_repl_arr[0]); int nReplReal = 0; for( int n = 0; n < nReplCount; n++ ) { if( _repl_arr[n].m_quadClrSrc == quadClrTransparent ) { _repl_arr[n].m_bReplace = false; continue; } _repl_arr[n].m_quadClrDst = ::GetSysColor( _repl_arr[n].m_nDstSysColorIdx ); _repl_arr[n].m_quadClrDst = RGB( GetBValue(_repl_arr[n].m_quadClrDst), GetGValue(_repl_arr[n].m_quadClrDst), GetRValue(_repl_arr[n].m_quadClrDst) ); if( _repl_arr[n].m_quadClrDst == _repl_arr[n].m_quadClrSrc ) { _repl_arr[n].m_bReplace = false; continue; } nReplReal++; } // for( int n = 0; n < nReplCount; n++ ) if( nReplReal > 0 ) { LONG nPixelCount = bmpDescription.bmWidth * bmpDescription.bmHeight; for( LONG nPos = 0; nPos < nPixelCount; nPos++ ) { if( pSurface[nPos] == quadClrTransparent ) continue; for( int n = 0; n < nReplCount; n++ ) { if( ! (_repl_arr[n].m_bReplace) ) continue; if( pSurface[nPos] != _repl_arr[n].m_quadClrSrc ) continue; pSurface[nPos] = _repl_arr[n].m_quadClrDst; } // for( int n = 0; n < nReplCount; n++ ) } // for( LONG nPos = 0; nPos < nPixelCount; nPos++ ) } // if( nReplReal > 0 ) } // if( bReplaceSysColors ) int nImgIdx = _il.Add( &bmpExtracted, clrTransparent ); if( nImgIdx < 0 ) { ASSERT( FALSE ); return NULL; } HICON hIcon = _il.ExtractIcon( nImgIdx ); ASSERT( hIcon != NULL ); return hIcon; } HBITMAP CExtPaintManager::stat_CloneBitmap( HBITMAP hBmpSrc, const RECT * pRcPart, // = NULL COLORREF ** ppSurface // = NULL // if not NULL - create 32 bit surface ) { if( hBmpSrc == NULL ) { ASSERT( FALSE ); return NULL; } BITMAP _bmpInfo; ::memset( &_bmpInfo, 0, sizeof(BITMAP) ); ::GetObject( hBmpSrc, sizeof(BITMAP), &_bmpInfo ); #ifdef _DEBUG DWORD dwLastError = ::GetLastError(); dwLastError; #endif // _DEBUG ASSERT( _bmpInfo.bmWidth > 0 && _bmpInfo.bmHeight > 0 ); CPoint _ptSrc( 0, 0 ); CSize _sizeDest( _bmpInfo.bmWidth, _bmpInfo.bmHeight ); if( pRcPart != NULL ) { ASSERT( pRcPart->left < pRcPart->right ); ASSERT( pRcPart->top < pRcPart->bottom ); ASSERT( 0 <= pRcPart->left && pRcPart->left <= _bmpInfo.bmWidth ); ASSERT( 0 <= pRcPart->right && pRcPart->right <= _bmpInfo.bmWidth ); ASSERT( 0 <= pRcPart->top && pRcPart->top <= _bmpInfo.bmHeight ); ASSERT( 0 <= pRcPart->bottom && pRcPart->bottom <= _bmpInfo.bmHeight ); _sizeDest.cx = pRcPart->right - pRcPart->left; _sizeDest.cy = pRcPart->bottom - pRcPart->top; ASSERT( _sizeDest.cx <= _bmpInfo.bmWidth ); ASSERT( _sizeDest.cy <= _bmpInfo.bmHeight ); _ptSrc.x = pRcPart->left; _ptSrc.y = pRcPart->top; } // if( pRcPart != NULL ) HDC hSrcDC = ::CreateCompatibleDC( NULL ); if( hSrcDC == NULL ) { ASSERT( FALSE ); return NULL; } HGDIOBJ hBmpSrcOld = ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrc ); HBITMAP hBmpDst = NULL; if( ppSurface != NULL ) { BITMAPINFOHEADER bih; ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = _sizeDest.cx; bih.biHeight = _sizeDest.cy; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = _sizeDest.cx * _sizeDest.cy; hBmpDst = ::CreateDIBSection( hSrcDC, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)ppSurface, NULL, NULL ); ASSERT( hBmpDst != NULL ); ASSERT( (*ppSurface) != NULL ); } // if( ppSurface != NULL ) else { hBmpDst = ::CreateCompatibleBitmap( hSrcDC, _sizeDest.cx, _sizeDest.cy ); ASSERT( hBmpDst != NULL ); } // else from if( ppSurface != NULL ) if( hBmpDst == NULL ) { ASSERT( FALSE ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); return NULL; } HDC hDstDC = ::CreateCompatibleDC( NULL ); if( hDstDC == NULL ) { ASSERT( FALSE ); ::DeleteObject( hBmpDst ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); return NULL; } HGDIOBJ hBmpDstOld = ::SelectObject( hDstDC, (HGDIOBJ)hBmpDst ); VERIFY( ::BitBlt( hDstDC, 0, 0, _sizeDest.cx, _sizeDest.cy, hSrcDC, _ptSrc.x, _ptSrc.y, SRCCOPY ) ); ::SelectObject( hDstDC, (HGDIOBJ)hBmpDstOld ); ::DeleteDC( hDstDC ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); return hBmpDst; } bool CExtPaintManager::stat_CloneBitmap( CBitmap & bmpDst, const CBitmap & bmpSrc, const RECT * pRcPart, // = NULL COLORREF ** ppSurface // = NULL // if not NULL - create 32 bit surface ) { if( bmpSrc.GetSafeHandle() == NULL ) { ASSERT( FALSE ); return false; } if( bmpDst.GetSafeHandle() != NULL ) bmpDst.DeleteObject(); HBITMAP hBmpDst = stat_CloneBitmap( (HBITMAP)bmpSrc.GetSafeHandle(), pRcPart, ppSurface ); if( hBmpDst == NULL ) { ASSERT( FALSE ); return false; } bmpDst.Attach( hBmpDst ); return true; } INT CExtPaintManager::stat_GetBitmapColorMap( // returns bitmap's color bit count or zero if error HBITMAP hBmpSrc, CMap < COLORREF, COLORREF, DWORD, DWORD > & _map // key is color, value is count of color entries in bitmap ) { _map.RemoveAll(); if( hBmpSrc == NULL ) { ASSERT( FALSE ); return 0; } BITMAP bmpSrcDescription; ::memset( &bmpSrcDescription, 0, sizeof(BITMAP) ); ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpSrcDescription ); ASSERT( bmpSrcDescription.bmWidth > 0 && bmpSrcDescription.bmHeight > 0 ); HDC hSrcDC = ::CreateCompatibleDC( NULL ); if( hSrcDC == NULL ) { ASSERT( FALSE ); return 0; } LONG nPixelCount = bmpSrcDescription.bmWidth*bmpSrcDescription.bmHeight; HGDIOBJ hBmpSrcOld = ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrc ); BITMAPINFOHEADER bih; ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bmpSrcDescription.bmWidth; bih.biHeight = bmpSrcDescription.bmHeight; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = nPixelCount; RGBQUAD * pColor = NULL; HBITMAP hBmpDst = ::CreateDIBSection( hSrcDC, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pColor, NULL, NULL ); if( hBmpDst == NULL ) { ASSERT( FALSE ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); return 0; } ASSERT( pColor != NULL ); HDC hDstDC = ::CreateCompatibleDC( NULL ); if( hDstDC == NULL ) { ASSERT( FALSE ); ::DeleteObject( hBmpDst ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); return NULL; } HGDIOBJ hBmpDstOld = ::SelectObject( hDstDC, (HGDIOBJ)hBmpDst ); VERIFY( ::BitBlt( hDstDC, 0, 0, bmpSrcDescription.bmWidth, bmpSrcDescription.bmHeight, hSrcDC, 0, 0, SRCCOPY ) ); for( ; nPixelCount > 0; pColor++, nPixelCount-- ) { COLORREF clrToInsert = RGB( pColor->rgbRed, pColor->rgbGreen, pColor->rgbBlue ); DWORD dwEntries = 0; if( _map.Lookup( clrToInsert, dwEntries ) ) { ASSERT( dwEntries > 0 ); dwEntries++; _map.SetAt( clrToInsert, dwEntries ); } // if( _map.Lookup( clrToInsert, dwEntries ) ) else _map.SetAt( clrToInsert, 1 ); } // for( ; nPixelCount > 0; pColor++, nPixelCount-- ) ::SelectObject( hDstDC, (HGDIOBJ)hBmpDstOld ); ::DeleteDC( hDstDC ); ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld ); ::DeleteDC( hSrcDC ); ::DeleteObject( hBmpDst ); return bmpSrcDescription.bmBitsPixel; } INT CExtPaintManager::stat_GetBitmapColorArray( // returns bitmap's color bit count or zero if error HBITMAP hBmpSrc, CArray < COLORREF, COLORREF > & arr, bool bMakeUniqueColors // = true // used only if bit count <= 8 ) { arr.RemoveAll(); if( hBmpSrc == NULL ) { ASSERT( FALSE ); return 0; } BITMAP bmpSrcDescription; ::memset( &bmpSrcDescription, 0, sizeof(BITMAP) ); ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpSrcDescription ); ASSERT( bmpSrcDescription.bmWidth > 0 && bmpSrcDescription.bmHeight > 0 ); if( bmpSrcDescription.bmBitsPixel <= 8 ) { HGLOBAL hGlobalDst = stat_HBITMAPtoHGLOBAL( hBmpSrc ); if( hGlobalDst == NULL ) { ASSERT( FALSE ); return 0; } INT nBitCount = (INT) ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount; ASSERT( nBitCount <= 8 ); INT nColorCount = 1L << nBitCount; RGBQUAD * pColor = (RGBQUAD *) ( ((LPBYTE)hGlobalDst) + ((LPBITMAPINFOHEADER)hGlobalDst)->biSize ); for( INT i = 0; i < nColorCount; i++ ) { COLORREF clrToInsert = RGB( pColor[i].rgbRed, pColor[i].rgbGreen, pColor[i].rgbBlue ); arr.Add( clrToInsert ); } // for( INT i = 0; i < nColorCount; i++ ) ::GlobalFree( hGlobalDst ); if( bMakeUniqueColors ) { INT nCount = arr.GetSize(); if( nCount < 2 ) return bmpSrcDescription.bmBitsPixel; for( INT i = 0; i < (nCount-1); i++ ) { COLORREF clrTest = arr[i]; for( INT j = i+1; j < nCount; ) { COLORREF clrToCmp = arr[j]; if( clrTest == clrToCmp ) { arr.RemoveAt( j, 1 ); nCount --; } // if( clrTest == clrToCmp ) else j++; } // for( INT j = i+1; j < nCount; ) } // for( INT i = 0; i < (nCount-1); i++ ) } // if( bMakeUniqueColors ) return bmpSrcDescription.bmBitsPixel; } // if( bmpSrcDescription.bmBitsPixel <= 8 ) CMap < COLORREF, COLORREF, DWORD, DWORD > _map; INT nVal = stat_GetBitmapColorMap( hBmpSrc, _map ); if( nVal == 0 ) { ASSERT( FALSE ); return 0; } ASSERT( nVal == bmpSrcDescription.bmBitsPixel ); #ifdef _DEBUG INT nCount = _map.GetCount(); #endif // _DEBUG ASSERT( nCount > 0 ); POSITION pos = _map.GetStartPosition(); ASSERT( pos != NULL ); for( ; pos != NULL; ) { COLORREF clrToInsert = RGB(0,0,0); DWORD dwEntries = 0; _map.GetNextAssoc( pos, clrToInsert, dwEntries ); ASSERT( dwEntries > 0 ); arr.Add( clrToInsert ); } // for( ; pos != NULL; ) ASSERT( nCount == arr.GetSize() ); return bmpSrcDescription.bmBitsPixel; } HGLOBAL CExtPaintManager::stat_HBITMAPtoHGLOBAL( HBITMAP hBmpSrc, HPALETTE hPalDst // = NULL ) { if( hBmpSrc == NULL ) { ASSERT( FALSE ); return NULL; } if( hPalDst == NULL ) hPalDst = (HPALETTE)::GetStockObject( DEFAULT_PALETTE ); BITMAP bmpSrcDescription; ::memset( &bmpSrcDescription, 0, sizeof(BITMAP) ); ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpSrcDescription ); ASSERT( bmpSrcDescription.bmWidth > 0 && bmpSrcDescription.bmHeight > 0 ); BITMAPINFOHEADER bmpSrcInfoHdr; ::memset( &bmpSrcInfoHdr, 0, sizeof(BITMAPINFOHEADER) ); bmpSrcInfoHdr.biSize = sizeof(BITMAPINFOHEADER); bmpSrcInfoHdr.biWidth = bmpSrcDescription.bmWidth; bmpSrcInfoHdr.biHeight = bmpSrcDescription.bmHeight; bmpSrcInfoHdr.biPlanes = 1; bmpSrcInfoHdr.biBitCount = (WORD) ( bmpSrcDescription.bmPlanes * bmpSrcDescription.bmBitsPixel ); bmpSrcInfoHdr.biCompression = BI_RGB; INT nColors = (bmpSrcInfoHdr.biBitCount > 8) ? 0 : (1 << bmpSrcInfoHdr.biBitCount) ; DWORD dwLenAllocPart = bmpSrcInfoHdr.biSize + nColors * sizeof(RGBQUAD) ; HDC hDcSrc = ::CreateCompatibleDC( NULL ); if( hDcSrc == NULL ) { ASSERT( FALSE ); return NULL; } hPalDst = ::SelectPalette( hDcSrc, hPalDst, FALSE ); ::RealizePalette( hDcSrc ); HGLOBAL hGlobalDst = ::GlobalAlloc( GMEM_FIXED, dwLenAllocPart ); if( hGlobalDst == NULL ) { ASSERT( FALSE ); ::SelectPalette( hDcSrc, hPalDst, FALSE ); ::DeleteDC( hDcSrc ); return NULL; } // if( hBmpDst == NULL ) LPBITMAPINFOHEADER lpBmpSrcInfoHdr = (LPBITMAPINFOHEADER)hGlobalDst; *lpBmpSrcInfoHdr = bmpSrcInfoHdr; ::GetDIBits( hDcSrc, hBmpSrc, 0L, (DWORD)bmpSrcInfoHdr.biHeight, (LPBYTE)NULL, (LPBITMAPINFO)lpBmpSrcInfoHdr, (DWORD)DIB_RGB_COLORS ); bmpSrcInfoHdr = *lpBmpSrcInfoHdr; if( bmpSrcInfoHdr.biSizeImage == 0 ) bmpSrcInfoHdr.biSizeImage = ( ( ( ( bmpSrcInfoHdr.biWidth * bmpSrcInfoHdr.biBitCount ) + 31 ) & ~31 ) / 8 ) * bmpSrcInfoHdr.biHeight; dwLenAllocPart += bmpSrcInfoHdr.biSizeImage; HGLOBAL hGlobalTmp = ::GlobalReAlloc( hGlobalDst, dwLenAllocPart, GMEM_MOVEABLE ); if( hGlobalTmp == NULL ) { ASSERT( FALSE ); ::GlobalFree( hGlobalDst ) ; ::SelectPalette( hDcSrc, hPalDst, FALSE ); ::DeleteDC( hDcSrc ); return NULL; } // if( bmpSrcInfoHdr.biSizeImage == 0 ) hGlobalDst = hGlobalTmp; lpBmpSrcInfoHdr = (LPBITMAPINFOHEADER)hGlobalDst; if( ! (::GetDIBits( hDcSrc, hBmpSrc, 0L, (DWORD)bmpSrcInfoHdr.biHeight, (LPBYTE)lpBmpSrcInfoHdr + (bmpSrcInfoHdr.biSize + nColors * sizeof(RGBQUAD)), (LPBITMAPINFO)lpBmpSrcInfoHdr, (DWORD)DIB_RGB_COLORS ) ) ) { ASSERT( FALSE ); ::GlobalFree( hGlobalDst ); hGlobalDst = NULL; } ::SelectPalette( hDcSrc, hPalDst, FALSE ); ::DeleteDC( hDcSrc ); return hGlobalDst; } bool CExtPaintManager::stat_SerializeBitmap( CArchive & ar, HBITMAP * p_hBmp, DWORD dwResourceSize // = 0L // not 0 only if loaded from resources ) { ASSERT( p_hBmp != NULL ); if( ar.IsStoring() ) { ASSERT( (*p_hBmp) != NULL ); HGLOBAL hGlobalDst = stat_HBITMAPtoHGLOBAL( *p_hBmp ); if( hGlobalDst == NULL ) { ASSERT( FALSE ); return false; } DWORD dwSizeofBmpTmp = ::GlobalSize( hGlobalDst ); ASSERT( dwSizeofBmpTmp > 0 ); BITMAPFILEHEADER bmpFileHdr; ::memset( &bmpFileHdr, 0, sizeof(BITMAPFILEHEADER) ); bmpFileHdr.bfType = ( (WORD)( 'M' << 8 ) | (WORD)('B') ); bmpFileHdr.bfSize = sizeof(BITMAPFILEHEADER) + dwSizeofBmpTmp; bmpFileHdr.bfOffBits = (DWORD) ( sizeof(BITMAPFILEHEADER) + ((LPBITMAPINFOHEADER)hGlobalDst)->biSize + ( ( ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount > 8 ) ? 0L : ( 1L << ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount ) ) * sizeof(RGBQUAD) ); ar.Write( (LPVOID)&bmpFileHdr, sizeof(BITMAPFILEHEADER) ); ar.Write( (LPVOID)hGlobalDst, dwSizeofBmpTmp ); ::GlobalFree( hGlobalDst ); } // if( ar.IsStoring() ) else { ASSERT( (*p_hBmp) == NULL ); BITMAPFILEHEADER bmpFileHdr; ::memset( &bmpFileHdr, 0, sizeof(BITMAPFILEHEADER) ); DWORD dwLenAllocPart = 0L; if( dwResourceSize == 0L ) { ar.Read( (LPVOID)&bmpFileHdr, sizeof(BITMAPFILEHEADER) ); dwLenAllocPart = bmpFileHdr.bfSize - sizeof(BITMAPFILEHEADER); if( dwLenAllocPart == 0 ) { ASSERT( FALSE ); return false; } } // if( dwResourceSize == 0L ) else dwLenAllocPart = dwResourceSize; HGLOBAL hGlobalDst = ::GlobalAlloc( GMEM_FIXED, dwLenAllocPart ); if( hGlobalDst == NULL ) { ASSERT( FALSE ); return false; } ar.Read( (LPVOID)hGlobalDst, dwLenAllocPart ); LPVOID pBits = NULL; HDC hDC = ::CreateCompatibleDC( NULL ); (*p_hBmp) = ::CreateDIBSection( hDC, (LPBITMAPINFO)hGlobalDst, DIB_RGB_COLORS, &pBits, NULL, 0 ); ::DeleteDC( hDC ); if( (*p_hBmp) == NULL || pBits == NULL ) { ASSERT( FALSE ); (*p_hBmp) = NULL; return false; } DWORD sizeof_BITMAPINFOHEADER = ((LPBITMAPINFOHEADER)hGlobalDst)->biSize; if( sizeof_BITMAPINFOHEADER < sizeof(BITMAPINFOHEADER) ) { ASSERT( FALSE ); ::DeleteObject( (*p_hBmp) ); ::GlobalFree( hGlobalDst ); return false; } ::memcpy( pBits, ((LPBYTE)hGlobalDst) + ( ( dwResourceSize == 0L ) ? (bmpFileHdr.bfOffBits - sizeof(BITMAPFILEHEADER)) : (sizeof_BITMAPINFOHEADER + ( ( ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount > 8 ) ? 0L : ( 1L << ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount ) ) * sizeof(RGBQUAD) ) ) , dwLenAllocPart - sizeof_BITMAPINFOHEADER - ( ( ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount > 8 ) ? 0L : ( 1L << ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount ) ) * sizeof(RGBQUAD) ); ::GlobalFree( hGlobalDst ); } // else from if( ar.IsStoring() ) return true; } bool CExtPaintManager::stat_SerializeBitmap( __EXT_MFC_SAFE_LPCTSTR strFileName, bool bRead, HBITMAP * p_hBmp ) { ASSERT( strFileName != NULL ); if( strFileName == NULL ) return false; bool bRetVal = true; try { CFile _file( strFileName, bRead ? (CFile::modeRead | CFile::typeBinary) : (CFile::modeWrite | CFile::modeCreate | CFile::typeBinary) ); CArchive ar( &_file, bRead ? CArchive::load : CArchive::store ); bRetVal = stat_SerializeBitmap( ar, p_hBmp ); ASSERT( bRetVal ); if( !bRead ) ar.Flush(); ar.Close(); _file.Close(); } // try catch( CException * pXept ) { ASSERT( FALSE ); pXept->Delete(); return false; } // catch( CException * pXept ) catch( ... ) { ASSERT( FALSE ); return false; } // catch( ... ) return bRetVal; } HBITMAP CExtPaintManager::stat_LoadBitmapResource( HINSTANCE hInst, HRSRC hRsrc ) { if( hInst == NULL || hRsrc == NULL ) return NULL; HGLOBAL hGlobal = ::LoadResource( hInst, hRsrc ); if( hGlobal == NULL ) return NULL; LPBYTE pData = (LPBYTE)::LockResource( hGlobal ); if( pData == NULL ) { ::FreeResource( hGlobal ); return NULL; } // if( pData == NULL ) DWORD dwResourceSize = ::SizeofResource( hInst, hRsrc ); ASSERT( dwResourceSize > 0 ); CMemFile _file; _file.Attach( pData, dwResourceSize ); _file.Seek( 0, CFile::begin ); CArchive ar( &_file, CArchive::load ); HBITMAP hBmp = NULL; bool bSerializationPassed = stat_SerializeBitmap( ar, &hBmp, dwResourceSize ); ASSERT( bSerializationPassed ); ar.Close(); _file.Detach(); ::UnlockResource( hGlobal ); ::FreeResource( hGlobal ); if( !bSerializationPassed ) return NULL; ASSERT( hBmp != NULL ); return hBmp; } HBITMAP CExtPaintManager::stat_LoadBitmapResource( __EXT_MFC_SAFE_LPCTSTR sResourceID, __EXT_MFC_SAFE_LPCTSTR sResourceType, // = RT_BITMAP, // default bitmap section HINSTANCE hInst // = NULL // find it automatically ) { if( hInst == NULL ) { hInst = ::AfxFindResourceHandle( sResourceID, sResourceType ); if( hInst == NULL ) return NULL; } // if( hInst == NULL ) HRSRC hRsrc = ::FindResource( hInst, sResourceID, sResourceType ); if( hRsrc == NULL ) return NULL; return stat_LoadBitmapResource( hInst, hRsrc ); } void CExtPaintManager::stat_GetMonitorParms( CExtPaintManager::monitor_parms_t & _mp ) { VERIFY( ::GetWindowRect( ::GetDesktopWindow(), &_mp.m_rcMonitor ) ); VERIFY( ::SystemParametersInfo( SPI_GETWORKAREA, 0, PVOID(&_mp.m_rcWorkArea), 0 ) ); _mp.m_bPrimaryMonitor = true; } void CExtPaintManager::stat_GetMonitorParms( CExtPaintManager::monitor_parms_t & _mp, const POINT & _ptScreenFrom ) { MONITORINFO _MonitorInfo; ::memset( &_MonitorInfo, 0, sizeof(MONITORINFO) ); _MonitorInfo.cbSize = sizeof(MONITORINFO); if( !::GetMonitorInfo( MonitorFromPoint( _ptScreenFrom, MONITOR_DEFAULTTONEAREST ), &_MonitorInfo ) ) { ASSERT( FALSE ); stat_GetMonitorParms( _mp ); return; } _mp.m_rcMonitor = _MonitorInfo.rcMonitor; _mp.m_rcWorkArea = _MonitorInfo.rcWork; _mp.m_bPrimaryMonitor = ( (_MonitorInfo.dwFlags&MONITORINFOF_PRIMARY) != 0 ) ? true : false ; } void CExtPaintManager::stat_GetMonitorParms( CExtPaintManager::monitor_parms_t & _mp, const RECT & _rcScreenFrom ) { MONITORINFO _MonitorInfo; ::memset( &_MonitorInfo, 0, sizeof(MONITORINFO) ); _MonitorInfo.cbSize = sizeof(MONITORINFO); if( !::GetMonitorInfo( MonitorFromRect( &_rcScreenFrom, MONITOR_DEFAULTTONEAREST ), &_MonitorInfo ) ) { ASSERT( FALSE ); stat_GetMonitorParms( _mp ); return; } _mp.m_rcMonitor = _MonitorInfo.rcMonitor; _mp.m_rcWorkArea = _MonitorInfo.rcWork; _mp.m_bPrimaryMonitor = ( (_MonitorInfo.dwFlags&MONITORINFOF_PRIMARY) != 0 ) ? true : false ; } void CExtPaintManager::stat_GetMonitorParms( monitor_parms_t & _mp, HWND hWndFrom ) { ASSERT( hWndFrom != NULL && ::IsWindow(hWndFrom) ); RECT rcWnd = { 0, 0, 0, 0 }; VERIFY( ::GetWindowRect( hWndFrom, &rcWnd ) ); stat_GetMonitorParms( _mp, rcWnd ); } void CExtPaintManager::stat_GetMonitorParms( monitor_parms_t & _mp, CWnd * pWndFrom ) { ASSERT_VALID( pWndFrom ); stat_GetMonitorParms( _mp, pWndFrom->GetSafeHwnd() ); } CRect CExtPaintManager::stat_AlignWndRectToMonitor( CRect rcInitial, bool bUseWorkArea, // = true // if false - use all monitor area bool bNoPartialVisibility // = false ) { monitor_parms_t _mp; stat_GetMonitorParms( _mp, rcInitial ); CRect rcDesktop = bUseWorkArea ? _mp.m_rcWorkArea : _mp.m_rcMonitor; if( rcInitial.left >= rcDesktop.right ) rcInitial.OffsetRect( rcDesktop.right - rcInitial.right, 0 ); if( rcInitial.top >= rcDesktop.bottom ) rcInitial.OffsetRect( 0, rcDesktop.bottom - rcInitial.bottom ); if( rcInitial.right <= rcDesktop.left ) rcInitial.OffsetRect( rcDesktop.left - rcInitial.left, 0 ); if( rcInitial.bottom <= rcDesktop.top ) rcInitial.OffsetRect( 0, rcDesktop.top - rcInitial.top ); if( bNoPartialVisibility ) { if( rcInitial.right > rcDesktop.right ) rcInitial.OffsetRect( rcDesktop.right - rcInitial.right, 0 ); if( rcInitial.bottom > rcDesktop.bottom ) rcInitial.OffsetRect( 0, rcDesktop.bottom - rcInitial.bottom ); if( rcInitial.left < rcDesktop.left ) rcInitial.OffsetRect( rcDesktop.left - rcInitial.left, 0 ); if( rcInitial.top < rcDesktop.top ) rcInitial.OffsetRect( 0, rcDesktop.top - rcInitial.top ); } // if( bNoPartialVisibility ) return rcInitial; } COLORREF CExtPaintManager::stat_RGBtoCMY( COLORREF clr ) { int nR = GetRValue( clr ); int nG = GetGValue( clr ); int nB = GetBValue( clr ); int nC = 255-nR; int nM = 255-nG; int nY = 255-nB; COLORREF clrCMY = RGB( nC, nM, nY ); return clrCMY; } COLORREF CExtPaintManager::stat_CMYtoRGB( COLORREF clr ) { int nC = GetRValue( clr ); int nM = GetGValue( clr ); int nY = GetBValue( clr ); int nR = 255 - nC; int nG = 255 - nM; int nB = 255 - nY; COLORREF clrRGB = RGB( nR, nG, nB ); return clrRGB; } //---------------------------------------------------------------------- // Conversion between the HSL (Hue, Saturation, and Luminosity) // and RBG color model. //---------------------------------------------------------------------- // The conversion algorithms presented here come from the book by // Fundamentals of Interactive Computer Graphics by Foley and van Dam. // In the example code, HSL values are represented as floating point // number in the range 0 to 1. RGB tridrants use the Windows convention // of 0 to 255 of each element. //---------------------------------------------------------------------- double CExtPaintManager::stat_HuetoRGB(double m1, double m2, double h ) { if( h < 0 ) h += 1.0; if( h > 1 ) h -= 1.0; if( 6.0*h < 1 ) return (m1+(m2-m1)*h*6.0); if( 2.0*h < 1 ) return m2; if( 3.0*h < 2.0 ) return (m1+(m2-m1)*((2.0/3.0)-h)*6.0); return m1; } COLORREF CExtPaintManager::stat_HLStoRGB( double H, double L, double S ) { double r,g,b; double m1, m2; if( S==0 ) { r = g = b = L; } else { if( L <= 0.5 ) m2 = L*(1.0+S); else m2 = L+S-L*S; m1 = 2.0*L-m2; r = stat_HuetoRGB(m1,m2,H+1.0/3.0); g = stat_HuetoRGB(m1,m2,H); b = stat_HuetoRGB(m1,m2,H-1.0/3.0); } return RGB((BYTE)(r*255),(BYTE)(g*255),(BYTE)(b*255)); } void CExtPaintManager::stat_RGBtoHSL( COLORREF rgb, double *H, double *S, double *L ) { double delta; double r = (double)GetRValue(rgb)/255; double g = (double)GetGValue(rgb)/255; double b = (double)GetBValue(rgb)/255; double cmax = max(r,max(g,b)); double cmin = min(r,min(g,b)); *L = (cmax + cmin) / 2.0; if(cmax==cmin) { *S = 0; *H = 0; // it's really undefined } else { if( *L < 0.5 ) *S = (cmax-cmin)/(cmax+cmin); else *S = (cmax-cmin)/(2.0-cmax-cmin); delta = cmax - cmin; if( r == cmax ) *H = (g-b)/delta; else if( g == cmax ) *H = 2.0 +(b-r)/delta; else *H = 4.0 + (r-g)/delta; *H /= 6.0; if( *H < 0.0 ) *H += 1; } } BYTE CExtPaintManager::stat_GetRGBFromHue(float rm1, float rm2, float rh) { if (rh > 360.0f) rh -= 360.0f; else if (rh < 0.0f) rh += 360.0f; if (rh < 60.0f) rm1 = rm1 + (rm2 - rm1) * rh / 60.0f; else if (rh < 180.0f) rm1 = rm2; else if (rh < 240.0f) rm1 = rm1 + (rm2 - rm1) * (240.0f - rh) / 60.0f; return static_cast<BYTE>(rm1 * 255); } COLORREF CExtPaintManager::stat_GetRGBFromHLSExtend( double H, double L, double S ) { WORD R, G, B; if( S == 0.0 ) { R = G = B = unsigned char(L * 255.0); } else { float rm1, rm2; if( L <= 0.5f ) rm2 = (float)(L + L * S); else rm2 = (float)(L + S - L * S); rm1 = (float)(2.0f * L - rm2); R = stat_GetRGBFromHue(rm1, rm2, (float)(H + 120.0f)); G = stat_GetRGBFromHue(rm1, rm2, (float)(H)); B = stat_GetRGBFromHue(rm1, rm2, (float)(H - 120.0f)); } return RGB(R, G, B); } COLORREF CExtPaintManager::stat_HLS_Adjust( COLORREF clr, double percentH, // = 0.0 double percentL, // = 0.0 double percentS // = 0.0 ) { double H = 0.0, L = 0.0, S = 0.0; stat_RGBtoHSL( clr, &H, &S, &L ); if( percentH > 0.0 ) H = H + (1.0 - H) * percentH ; else if ( percentH < 0.0 ) H = H * (1.0 + percentH); if( H < 0.0 ) H = 0.0; else if( H > 1.0 ) H = 1.0; if( percentL > 0.0 ) L = L + (1.0 - L) * percentL ; else if ( percentL < 0.0 ) L = L * (1.0 + percentL); if( L < 0.0 ) L = 0.0; else if( L > 1.0 ) L = 1.0; if ( percentS > 0.0 ) S = S + (1.0 - S) * percentS ; else if ( percentS < 0.0 ) S = S * (1.0 + percentS); if( S < 0.0 ) S = 0.0; else if( S > 1.0 ) S = 1.0; return stat_HLStoRGB( H, L, S ); } BOOL CExtPaintManager::stat_PaintParentBk( HWND hWnd, HDC hDC, LPCRECT rectClip // = NULL ) { ASSERT( hDC != NULL ); ASSERT( ::IsWindow(hWnd) ); if( rectClip != NULL ) { CRgn rgn; rgn.CreateRectRgnIndirect( rectClip ); ::SelectClipRgn( hDC, (HRGN)rgn.GetSafeHandle() ); } HWND hWndParent = ::GetParent( hWnd ); ASSERT( ::IsWindow(hWndParent) ); CPoint pt( 0, 0 ); ::MapWindowPoints(hWnd,hWndParent,&pt,1); VERIFY( ::OffsetWindowOrgEx( hDC, pt.x, pt.y, &pt ) ); LRESULT lRes = ::SendMessage( hWndParent, WM_ERASEBKGND, (WPARAM)hDC, 0 ); VERIFY( ::SetWindowOrgEx( hDC, pt.x, pt.y, &pt ) ); ::SelectClipRgn( hDC, NULL ); return (BOOL)lRes; } bool CExtPaintManager::stat_DefIsHwndNeedsDirectRepaint( HWND hWndChild ) { DWORD dwChildStyle = DWORD( GetWindowLong(hWndChild,GWL_STYLE) ); if( (dwChildStyle & WS_CHILD) == 0 ) return true; CExtSafeString sClassName; ::GetClassName( hWndChild, sClassName.GetBuffer( _MAX_PATH+1 ), _MAX_PATH ); sClassName.ReleaseBuffer(); sClassName.MakeLower(); if( sClassName == LPCTSTR( _T("static") ) ) return true; if( sClassName == LPCTSTR( _T("systabcontrol32") ) ) return true; if( sClassName == LPCTSTR( _T("msctls_trackbar32") ) ) return true; if( sClassName == LPCTSTR( _T("button") ) && ( ( dwChildStyle & (BS_GROUPBOX|BS_CHECKBOX) ) != 0 || g_PaintManager.m_bUxApiInitPassed ) ) return true; return false; } bool CExtPaintManager::stat_DefExcludeChildAreaCallback( HDC hDC, HWND hWnd, HWND hWndChild, LPVOID pCookie ) { ASSERT( hDC != NULL ); ASSERT( hWnd != NULL ); ASSERT( IsWindow(hWnd) ); ASSERT( hWndChild != NULL ); ASSERT( IsWindow(hWndChild) ); hDC; hWnd; hWndChild; pCookie; return stat_DefIsHwndNeedsDirectRepaint( hWndChild ); } int CExtPaintManager::stat_GetBPP() { // return 4; // <-- test // return 8; // <-- test CWindowDC dc_desktop(NULL); int nBitsPerPixel = dc_desktop.GetDeviceCaps(BITSPIXEL); return nBitsPerPixel; } CSize CExtPaintManager::GetTextSizes(bool bBold /*= false*/) { CWindowDC dc (NULL); CFont * pOldFont = dc.SelectObject( bBold ? &m_FontBold : &m_FontNormal ); ASSERT( pOldFont != NULL ); TEXTMETRIC tm; dc.GetTextMetrics( &tm ); int nTextHeightHorz = tm.tmHeight + 2; dc.SelectObject( &m_FontNormal ); dc.GetTextMetrics( &tm ); int nTextHeightVert = tm.tmHeight + 2; dc.SelectObject( pOldFont ); return CSize(nTextHeightHorz,nTextHeightVert); } int CExtPaintManager::GetTextHeight(bool bHorz) { CSize _size = GetTextSizes(); return bHorz ? _size.cx : _size.cy; } static const UINT stat_pixels_glyph_btn_expand_bottom[] = { 1,1,1,1,1, 0,1,1,1,0, 0,0,1,0,0, }; static const UINT stat_pixels_glyph_btn_expand_bottom_2003[] = { 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,1,1,1,0, 0,0,1,0,0, }; const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_bottom( 5,3,2, stat_pixels_glyph_btn_expand_bottom ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_bottom_2003( 5,6,2, stat_pixels_glyph_btn_expand_bottom_2003 ); static const UINT stat_pixels_glyph_btn_expand_right2[] = { 1,1,0,0,1,1,0,0, 0,1,1,0,0,1,1,0, 0,0,1,1,0,0,1,1, 0,1,1,0,0,1,1,0, 1,1,0,0,1,1,0,0, }; static const UINT stat_pixels_glyph_btn_expand_right2_2003[] = { 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,0,1,1, 1,0,0,0,1,0, 0,0,0,0,0,0, }; const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_right2( 8,5,2, stat_pixels_glyph_btn_expand_right2 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_right2_2003( 6,5,2, stat_pixels_glyph_btn_expand_right2_2003 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_left( CExtPaintManager::g_glyph_btn_expand_bottom, 90 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_left_2003( CExtPaintManager::g_glyph_btn_expand_bottom_2003, 90 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_right( CExtPaintManager::g_glyph_btn_expand_bottom, 270 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_right_2003( CExtPaintManager::g_glyph_btn_expand_bottom_2003, 270 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_bottom2( CExtPaintManager::g_glyph_btn_expand_right2, 90 ); const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_btn_expand_bottom2_2003( CExtPaintManager::g_glyph_btn_expand_right2_2003, 90 ); static const UINT stat_pixels_glyph_customize_popup_src[] = { 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,1,1,1,1,0,0, 0,0,0,0,0,0,1,1,1,1,1,0, 0,0,0,0,0,0,1,1,1,1,1,1, 0,0,0,0,0,0,1,1,1,1,1,0, 0,0,0,0,0,0,1,1,1,1,0,0, 0,0,0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, }; const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_customize_popup_src( 12,16,2, stat_pixels_glyph_customize_popup_src ); static const UINT stat_pixels_glyph_customize_dropdown_src[] = { 1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,1,0,0,0,0,0, 1,0,0,0,0,0,1,1,0,0,0,0, 1,0,0,0,0,0,1,1,1,0,0,0, 1,0,0,0,0,0,1,1,1,1,0,0, 1,0,0,0,0,0,1,1,1,1,1,0, 1,0,0,0,0,0,1,1,1,1,1,1, 1,0,0,0,0,0,1,1,1,1,1,0, 1,0,0,0,0,0,1,1,1,1,0,0, 1,0,0,0,0,0,1,1,1,0,0,0, 1,0,0,0,0,0,1,1,0,0,0,0, 1,0,0,0,0,0,1,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0, }; const CExtPaintManager::glyph_t CExtPaintManager::g_glyph_customize_dropdown_src( 12,16,2, stat_pixels_glyph_customize_dropdown_src ); void CExtPaintManager::PaintGlyph( CDC & dc, POINT ptDest, const glyph_t & glyph, COLORREF * pColorValues ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( pColorValues != NULL ); ASSERT( glyph.Size().cx > 0 ); ASSERT( glyph.Size().cy > 0 ); CRect rcTestVisiblity(ptDest,glyph.Size()); if( !dc.RectVisible(&rcTestVisiblity) ) return; int x_dest = ptDest.x + glyph.Size().cx; int y_dest = ptDest.y + glyph.Size().cy; const UINT * pColorIndex = glyph.GetSurface(); ASSERT( pColorIndex != NULL ); for( int y = ptDest.y; y < y_dest; y++ ) { for( int x = ptDest.x; x < x_dest; x++, pColorIndex++ ) { UINT nColorIndex = *pColorIndex; ASSERT( nColorIndex < glyph.GetColorsCount() ); if( nColorIndex == 0 ) continue; COLORREF clr = pColorValues[nColorIndex]; dc.SetPixel( x, y, clr ); } } } void CExtPaintManager::PaintGlyphCentered( CDC & dc, const RECT & rect, const glyph_t & glyph, COLORREF * pColorValues ) { CRect _rect(rect); _rect.NormalizeRect(); if( _rect.IsRectEmpty() ) return; ASSERT( glyph.Size().cx > 0 ); ASSERT( glyph.Size().cy > 0 ); CPoint ptDest = _rect.TopLeft(); ptDest.x += (_rect.Width() - glyph.Size().cx) / 2; ptDest.y += (_rect.Height() - glyph.Size().cy) / 2; PaintGlyph( dc, ptDest, glyph, pColorValues ); } int CExtPaintManager::GetMenuExpandButtonHeight() { int nHeight = ::GetSystemMetrics(SM_CYMENUCHECK); ASSERT( nHeight > 0 ); return nHeight; } int CExtPaintManagerXP::GetMenuExpandButtonHeight() { return CExtPaintManager::GetMenuExpandButtonHeight(); } int CExtPaintManagerOffice2003::GetMenuExpandButtonHeight() { int nHeightNormal = CExtPaintManager::GetMenuExpandButtonHeight(); ASSERT( nHeightNormal > 0 ); return max( nHeightNormal, (m_sizeMenuExpBtnCircle.cy+2) ); } void CExtPaintManager::PaintMenuExpandButton( CDC & dc, const RECT & rectButton, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; bHover; CRect rcGlyph(rectButton); if( bPushed ) { dc.FillRect( &rcGlyph, &m_brushLightDefault ); dc.Draw3dRect( &rcGlyph, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } else { CExtPaintManager::PAINTMENUITEMDATA _pmid( this, rectButton, 0, _T(""), _T(""), NULL, false, false, false, false, false, true, false, false, false, 0 ); PaintMenuItem( dc, _pmid ); } COLORREF ColorValues[] = { RGB(0,0,0), GetColor(CLR_TEXT_OUT) }; PaintGlyphCentered( dc, rcGlyph, g_glyph_btn_expand_bottom2, ColorValues ); } void CExtPaintManagerXP::PaintMenuExpandButton( CDC & dc, const RECT & rectButton, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; bHover; int nIconAreaWidth = 0; if( pHelperSrc != NULL // (+ 2.23) && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) && ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetCount() > 0 ) { CExtPopupMenuWnd::MENUITEMDATA & _mii = ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetInfo( ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetCount() - 1 ); if( !_mii.IsToolButton() ) nIconAreaWidth = _mii.GetIconAreaWidth(); } if( !bPushed ) { CRect rc(rectButton); rc.top--; CExtPaintManager::PAINTMENUITEMDATA _pmid( this, rc, nIconAreaWidth, _T(""), _T(""), NULL, false, false, false, false, false, true, false, false, false, 0 ); PaintMenuItem( dc, _pmid ); } // if( !bPushed ) CRect rcGlyph(rectButton); if( bPushed ) { PAINTPUSHBUTTONDATA _ppbd( this, true,rectButton,_T(""),NULL, true,false,bPushed,false, false,true,false,false, __ALIGN_HORIZ_CENTER|__ALIGN_VERT, NULL, false ); PaintPushButton( dc, _ppbd ); rcGlyph.OffsetRect( GetPushedOffset() ); } else { CExtPaintManager::PAINTMENUITEMDATA _pmid( this, rectButton, nIconAreaWidth, _T(""), _T(""), NULL, false, false, false, false, false, true, false, false, false, 0 ); PaintMenuItem( dc, _pmid ); } COLORREF ColorValues[] = { RGB(0,0,0), GetColor(CLR_TEXT_OUT) }; PaintGlyphCentered( dc, rcGlyph, g_glyph_btn_expand_bottom2, ColorValues ); } void CExtPaintManagerOffice2003::PaintMenuExpandButton( CDC & dc, const RECT & rectButton, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT( m_sizeMenuExpBtnCircle.cx > 0 ); ASSERT( m_sizeMenuExpBtnCircle.cy > 0 ); CRect rcButton( rectButton ); // (+ 2.23) if( ( rcButton.Width() & 0x01 ) != 0 ) // (+ 2.23) rcButton.right --; // (+ 2.23) int nIconAreaWidth = 0; if( pHelperSrc != NULL // (+ 2.23) && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) && ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetCount() > 0 ) { CExtPopupMenuWnd::MENUITEMDATA & _mii = ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetInfo( ((CExtPopupMenuWnd*)pHelperSrc) -> ItemGetCount() - 1 ); if( !_mii.IsToolButton() ) nIconAreaWidth = _mii.GetIconAreaWidth(); } CPoint ptRgnEffectiveOffset( ( rcButton.right - rcButton.left - m_sizeMenuExpBtnCircle.cx ) / 2 + rcButton.left, ( rcButton.bottom - rcButton.top - m_sizeMenuExpBtnCircle.cy ) / 2 + rcButton.top ); CRgn rgnEffective; if( m_rgnMenuExpBtnCircle.GetSafeHandle() == NULL || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 || (! rgnEffective.CreateRectRgn(0,0,1,1) ) || rgnEffective.CopyRgn( &m_rgnMenuExpBtnCircle ) == ERROR || rgnEffective.OffsetRgn(ptRgnEffectiveOffset) == ERROR ) { CExtPaintManagerXP::PaintMenuExpandButton( dc, rectButton, bPushed, bHover, pHelperSrc, lParam ); return; } ASSERT( rgnEffective.GetSafeHandle() != NULL ); if( !bPushed ) { CRect rc(rcButton); rc.top--; CExtPaintManager::PAINTMENUITEMDATA _pmid( this, rc, nIconAreaWidth, _T(""), _T(""), NULL, false, false, false, false, false, true, false, false, false, 0 ); PaintMenuItem( dc, _pmid ); } CRect rcGlyph( rcButton ); if( bPushed ) { PAINTPUSHBUTTONDATA _ppbd( this, true,rectButton,_T(""),NULL, true,false,bPushed,false, false,true,false,false, __ALIGN_HORIZ_CENTER|__ALIGN_VERT, NULL, false ); PaintPushButton( dc, _ppbd ); rcGlyph.OffsetRect( GetPushedOffset() ); } else { CExtPaintManager::PAINTMENUITEMDATA _pmid( this, rectButton, nIconAreaWidth, _T(""), _T(""), NULL, false, false, false, false, false, true, false, false, false, 0 ); PaintMenuItem( dc, _pmid ); } CBrush _brBaloon( GetColor(_2003CLR_MENUEXPBALOON) ); ASSERT( _brBaloon.GetSafeHandle() != NULL ); ::FillRgn( dc, rgnEffective, (HBRUSH)_brBaloon.GetSafeHandle() ); COLORREF ColorValues[] = { RGB(0,0,0), GetColor(CLR_TEXT_OUT) }; PaintGlyphCentered( dc, rcGlyph, g_glyph_btn_expand_bottom2, ColorValues ); } void CExtPaintManager::PaintToolbarExpandButton( CDC & dc, const RECT & rcButtonArea, bool bHorz, // if false - down bool bBarIsCompletelyVisible, bool bEnabled, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam, // = 0L bool bTransparentBackground // = false ) { ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; CRect rect(rcButtonArea); rect.NormalizeRect(); if( !dc.RectVisible( &rect ) ) return; CRect rectButton(rect); // ASSERT( bLeft ); // temporary const glyph_t * pGlyph = NULL, * pGlyph2 = NULL; if( bHorz ) { pGlyph = &g_glyph_btn_expand_bottom; if( !bBarIsCompletelyVisible ) pGlyph2 = &g_glyph_btn_expand_right2; } else { pGlyph = &g_glyph_btn_expand_left; if( !bBarIsCompletelyVisible ) pGlyph2 = &g_glyph_btn_expand_bottom2; } ASSERT( pGlyph != NULL ); PAINTPUSHBUTTONDATA _ppbd( this, true,rect,_T(""),NULL,true, bHover,bPushed,false,bEnabled, true,false,false, __ALIGN_HORIZ_CENTER|__ALIGN_VERT, NULL,false,0,bTransparentBackground ); PaintPushButton( dc, _ppbd ); COLORREF clr = GetColor( bEnabled? CLR_TEXT_OUT : COLOR_3DHILIGHT ); COLORREF ColorValues[] = { 0, clr }; if( bPushed ) rect.OffsetRect( GetPushedOffset() ); CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size()); CRect rectGlyph2(rectGlyph); CSize sizePushedOffset = GetPushedOffset(); if( bPushed ) { rectGlyph.OffsetRect( sizePushedOffset ); rectGlyph2.OffsetRect( sizePushedOffset ); } if( bHorz ) { int nGap = (max(sizePushedOffset.cy,1)) * 3; rectGlyph.OffsetRect( (rectButton.Size().cx - pGlyph->Size().cx) / 2, rectButton.Size().cy - pGlyph->Size().cy - nGap ); if( !bBarIsCompletelyVisible ) { ASSERT( pGlyph2 != NULL ); rectGlyph2.OffsetRect( (rectButton.Size().cx - pGlyph2->Size().cx) / 2, nGap ); } } else { int nGap = (max(sizePushedOffset.cx,1)) * 3; rectGlyph.OffsetRect( nGap, (rectButton.Size().cy - pGlyph->Size().cy)/2 ); if( !bBarIsCompletelyVisible ) { ASSERT( pGlyph2 != NULL ); rectGlyph2.OffsetRect( rectButton.Size().cx - pGlyph2->Size().cx - nGap, (rectButton.Size().cy - pGlyph2->Size().cy) / 2 ); } } if( bEnabled ) { PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValues ); if( !bBarIsCompletelyVisible ) { ASSERT( pGlyph2 != NULL ); PaintGlyph( dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValues ); } } // if( bEnabled ) else { // rect.OffsetRect(1,1); // PaintGlyphCentered( // dc,rect,*pGlyph,ColorValues // ); // ColorValues[1] = GetColor(COLOR_3DSHADOW); // rect.OffsetRect(-1,-1); // PaintGlyphCentered( // dc,rect,*pGlyph,ColorValues // ); rectGlyph.OffsetRect(1,1); PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValues ); rectGlyph.OffsetRect(-1,-1); ColorValues[1] = GetColor(COLOR_3DSHADOW); PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValues ); } // else from if( bEnabled ) } void CExtPaintManagerXP::PaintToolbarExpandButton( CDC & dc, const RECT & rcButtonArea, bool bHorz, // if false - down bool bBarIsCompletelyVisible, bool bEnabled, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam, // = 0L bool bTransparentBackground // = false ) { ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; CRect rect(rcButtonArea); rect.NormalizeRect(); if( !dc.RectVisible( &rect ) ) return; CRect rectButton(rect); const glyph_t * pGlyph = NULL, * pGlyph2 = NULL; if( bHorz ) { pGlyph = m_pGlyphTbEpBtnH0; pGlyph2 = m_pGlyphTbEpBtnH1; } // if( bHorz ) else { pGlyph = m_pGlyphTbEpBtnV0; pGlyph2 = m_pGlyphTbEpBtnV1; } // else from if( bHorz ) ASSERT( pGlyph != NULL ); ASSERT( pGlyph2 != NULL ); PAINTPUSHBUTTONDATA _ppbd( this, true,rect,_T(""),NULL,true, bHover,bPushed,false,bEnabled, true,false,false, __ALIGN_HORIZ_CENTER|__ALIGN_VERT, NULL,false,0,bTransparentBackground ); PaintPushButton( dc, _ppbd ); COLORREF clr = GetColor( bEnabled? CLR_TEXT_OUT : COLOR_3DHILIGHT ); COLORREF ColorValues[] = { 0, clr }; if( bPushed ) rect.OffsetRect( GetPushedOffset() ); CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size()); CRect rectGlyph2(rectGlyph); CSize sizePushedOffset = GetPushedOffset(); if( bPushed ) { rectGlyph.OffsetRect( sizePushedOffset ); rectGlyph2.OffsetRect( sizePushedOffset ); } // if( bPushed ) if( bHorz ) { int nGap = (max(sizePushedOffset.cy,1)) * 3; rectGlyph.OffsetRect( (rectButton.Size().cx - pGlyph->Size().cx) / 2, // + 1 rectButton.Size().cy - pGlyph->Size().cy - nGap ); rectGlyph2.OffsetRect( (rectButton.Size().cx - pGlyph2->Size().cx) / 2 + 1, nGap ); } // if( bHorz ) else { int nGap = (max(sizePushedOffset.cx,1)) * 3; rectGlyph.OffsetRect( nGap, (rectButton.Size().cy - pGlyph->Size().cy)/2 // + 1 ); rectGlyph2.OffsetRect( rectButton.Size().cx - pGlyph2->Size().cx - nGap, (rectButton.Size().cy - pGlyph2->Size().cy) / 2 + 1 ); if( m_bExpBtnSwapVGlyphs ) { CRect rcTmp( rectGlyph ); rectGlyph = rectGlyph2; rectGlyph2 = rcTmp; } } // else from if( bHorz ) if( bEnabled ) { // if( bHover && (!bPushed) ) // { // COLORREF ColorValuesHover[] = // { // 0, // GetColor(COLOR_3DDKSHADOW) // }; // rectGlyph.OffsetRect(-1,-1); // rectGlyph2.OffsetRect(-1,-1); // PaintGlyph( // dc,rectGlyph.TopLeft(),*pGlyph,ColorValuesHover // ); // if( !bBarIsCompletelyVisible ) // PaintGlyph( // dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValuesHover // ); // rectGlyph.OffsetRect(1,1); // rectGlyph2.OffsetRect(1,1); // } PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValues ); if( !bBarIsCompletelyVisible ) PaintGlyph( dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValues ); } // if( bEnabled ) else { ColorValues[1] = GetColor(COLOR_3DSHADOW); PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValues ); } // else from if( bEnabled ) } void CExtPaintManagerOffice2003::PaintToolbarExpandButton( CDC & dc, const RECT & rcButtonArea, bool bHorz, // if false - down bool bBarIsCompletelyVisible, bool bEnabled, bool bPushed, bool bHover, CObject * pHelperSrc, LPARAM lParam, // = 0L bool bTransparentBackground // = false ) { ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; CRect rect(rcButtonArea); rect.NormalizeRect(); if( !dc.RectVisible( &rect ) ) return; CExtToolControlBar * pToolBar = NULL; bool bStyleOffice2003 = true; if( pHelperSrc == NULL || (! bEnabled) || (! pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) ) || (! GetCb2DbTransparentMode(pHelperSrc) ) || stat_GetBPP() <= 8 ) { bStyleOffice2003 = false; } else { pToolBar = ((CExtBarContentExpandButton*)pHelperSrc)->GetBar(); ASSERT_VALID( pToolBar ); if( pToolBar->m_bPaletteMode || pToolBar->m_pDockSite == NULL || pToolBar->IsFloating() || pToolBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) || pToolBar->IsKindOf(RUNTIME_CLASS(CExtPanelControlBar)) || pToolBar->m_bPresubclassDialogMode || pToolBar->m_pDockSite == NULL ) bStyleOffice2003 = false; } if( !bStyleOffice2003 ) { CExtPaintManagerXP::PaintToolbarExpandButton( dc, rcButtonArea, bHorz, bBarIsCompletelyVisible, bEnabled, bPushed, bHover, pHelperSrc, lParam, bTransparentBackground ); return; } ASSERT_VALID( pToolBar ); CRect rcToolbarClientArea; pToolBar->GetClientRect( &rcToolbarClientArea ); CRect rectButton( rect ); CRect rcBaloonExclude( rcToolbarClientArea ); if( bHorz ) { rectButton.OffsetRect( rcToolbarClientArea.right - rectButton.right, 0 ); rectButton.InflateRect( 1, 0, 0, 0 ); rectButton.top = rcToolbarClientArea.top; rectButton.bottom = rcToolbarClientArea.bottom - 1; rcBaloonExclude.right = rectButton.left + 1; rectButton.left -= m_sizeToolBarRgnRounders.cx; } // if( bHorz ) else { rectButton.OffsetRect( 0, rcToolbarClientArea.bottom - rectButton.bottom ); rectButton.InflateRect( 0, 1, 0, 0 ); rectButton.left = rcToolbarClientArea.left; rectButton.right = rcToolbarClientArea.right - 1; rcBaloonExclude.bottom = rectButton.top + 1; rectButton.top -= m_sizeToolBarRgnRounders.cy; } // else from if( bHorz ) CRgn rgnButton, rgnBE; if( (! rgnButton.CreateRoundRectRgn( rcToolbarClientArea.left, rcToolbarClientArea.top, rcToolbarClientArea.right, rcToolbarClientArea.bottom, m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy ) ) || (! rgnBE.CreateRoundRectRgn( rcBaloonExclude.left, rcBaloonExclude.top, rcBaloonExclude.right, rcBaloonExclude.bottom, m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy ) ) || rgnButton.CombineRgn( &rgnButton, &rgnBE, RGN_DIFF ) == ERROR ) { ASSERT( FALSE ); CExtPaintManagerXP::PaintToolbarExpandButton( dc, rcButtonArea, bHorz, bBarIsCompletelyVisible, bEnabled, bPushed, bHover, pHelperSrc, lParam, bTransparentBackground ); return; } dc.SelectClipRgn( &rgnButton ); if( bHover || bPushed ) { CRect rcSolidFill( rectButton ); rcSolidFill.InflateRect( 1, 1 ); // dc.FillSolidRect( // &rcSolidFill, // GetColor( // bPushed // ? _2003CLR_EXPBTN_PRESSED // : _2003CLR_EXPBTN_HOVER // ) // ); stat_PaintGradientRect( dc, &rcSolidFill, GetColor( bPushed ? ( bHorz ? _2003CLR_EXPBTN_PRESSED_LIGHT : _2003CLR_EXPBTN_PRESSED_DARK ) : ( bHorz ? _2003CLR_EXPBTN_HOVER_DARK : _2003CLR_EXPBTN_HOVER_LIGHT ) ), GetColor( bPushed ? ( bHorz ? _2003CLR_EXPBTN_PRESSED_DARK : _2003CLR_EXPBTN_PRESSED_LIGHT ) : ( bHorz ? _2003CLR_EXPBTN_HOVER_LIGHT : _2003CLR_EXPBTN_HOVER_DARK ) ), bHorz ); } // if( bHover || bPushed ) else { if( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater ) { stat_PaintGradientRect( dc, rectButton, GetColor( bHorz ? _2003CLR_EXPBTN_DARK : _2003CLR_EXPBTN_LIGHT ), GetColor( bHorz ? _2003CLR_EXPBTN_LIGHT : _2003CLR_EXPBTN_DARK ), bHorz ); } else { CRect rectButton1(rectButton), rectButton2(rectButton); if( bHorz ) { rectButton1.bottom = rectButton1.top + MulDiv( rectButton1.Height(), 3, 5 ); rectButton2.top = rectButton1.bottom; } // if( bHorz ) else { rectButton1.right = rectButton1.left + MulDiv( rectButton1.Width(), 3, 5 ); rectButton2.left = rectButton1.right; } // else from if( bHorz ) dc.FillSolidRect( &rectButton2, GetColor( _2003CLR_EXPBTN_DARK ) ); stat_PaintGradientRect( dc, rectButton1, GetColor( bHorz ? _2003CLR_EXPBTN_DARK : _2003CLR_EXPBTN_LIGHT ), GetColor( bHorz ? _2003CLR_EXPBTN_LIGHT : _2003CLR_EXPBTN_DARK ), bHorz ); } } // else from if( bHover || bPushed ) const glyph_t * pGlyph = NULL, * pGlyph2 = NULL; if( bHorz ) { pGlyph = m_pGlyphTbEpBtnH0; pGlyph2 = m_pGlyphTbEpBtnH1; } // if( bHorz ) else { pGlyph = m_pGlyphTbEpBtnV0; pGlyph2 = m_pGlyphTbEpBtnV1; } // else from if( bHorz ) ASSERT( pGlyph != NULL ); ASSERT( pGlyph2 != NULL ); COLORREF ColorValuesLight[] = { 0, GetColor( _2003CLR_EXPGLYPH_LIGHT ) }; COLORREF ColorValuesDark[] = { 0, GetColor( _2003CLR_EXPGLYPH_DARK ) }; CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size()); CRect rectGlyph2(rectGlyph); CSize sizePushedOffset = GetPushedOffset(); if( bHorz ) { int nGap = (max(sizePushedOffset.cy,1)) * 3; rectGlyph.OffsetRect( (rectButton.Size().cx - pGlyph->Size().cx) / 2 + 1, rectButton.Size().cy - pGlyph->Size().cy - nGap - 1 ); rectGlyph2.OffsetRect( (rectButton.Size().cx - pGlyph2->Size().cx) / 2 + 1, nGap + 1 ); } // if( bHorz ) else { int nGap = (max(sizePushedOffset.cx,1)) * 3; rectGlyph.OffsetRect( nGap + 1, (rectButton.Size().cy - pGlyph->Size().cy)/2 + 1 ); rectGlyph2.OffsetRect( rectButton.Size().cx - pGlyph2->Size().cx - nGap - 1, (rectButton.Size().cy - pGlyph2->Size().cy) / 2 + 1 ); ASSERT( m_bExpBtnSwapVGlyphs ); CRect rcTmp( rectGlyph ); rectGlyph = rectGlyph2; rectGlyph2 = rcTmp; } // else from if( bHorz ) rectGlyph.OffsetRect(1,1); rectGlyph2.OffsetRect(1,1); PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValuesLight ); if( !bBarIsCompletelyVisible ) PaintGlyph( dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValuesLight ); rectGlyph.OffsetRect(-1,-1); rectGlyph2.OffsetRect(-1,-1); PaintGlyph( dc,rectGlyph.TopLeft(),*pGlyph,ColorValuesDark ); if( !bBarIsCompletelyVisible ) PaintGlyph( dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValuesDark ); dc.SelectClipRgn( NULL ); } void CExtPaintManager::stat_ExcludeChildAreas( HDC hDC, HWND hWnd, CExtPaintManager::pfnExcludeChildAreaCallback pCallback, // = NULL LPVOID pCallbackCookie // = NULL ) { if( hDC == NULL || !IsWindow(hWnd) ) return; HWND hWndChild = GetWindow(hWnd,GW_CHILD); for(; hWndChild != NULL; hWndChild = GetWindow(hWndChild,GW_HWNDNEXT)) { if( !IsWindowVisible(hWndChild) ) continue; DWORD dwChildStyle = DWORD( GetWindowLong(hWndChild,GWL_STYLE) ); if( (dwChildStyle & WS_CHILD) == 0 ) continue; RECT rc; if( !GetWindowRect(hWndChild,&rc) ) continue; if( !ScreenToClient(hWnd, (LPPOINT)(&rc)) ) continue; if( !ScreenToClient(hWnd, ((LPPOINT)(&rc))+1) ) continue; if( pCallback != NULL ) { if( pCallback( hDC, hWnd, hWndChild, pCallbackCookie ) ) continue; } ExcludeClipRect( hDC, rc.left,rc.top, rc.right,rc.bottom ); } // for(; hWndChild != NULL; hWndChild = GetWindow(hWndChild,GW_HWNDNEXT)) } //static volatile bool stat_bTrySysTransparentBlt = true; //static volatile HMODULE stat_hModuleMsimg32 = NULL; //typedef BOOL (*pMsimg32_TransparentBlt_t)( // HDC hdcDest, // handle to destination DC // int nXOriginDest, // x-coord of destination upper-left corner // int nYOriginDest, // y-coord of destination upper-left corner // int nWidthDest, // width of destination rectangle // int hHeightDest, // height of destination rectangle // HDC hdcSrc, // handle to source DC // int nXOriginSrc, // x-coord of source upper-left corner // int nYOriginSrc, // y-coord of source upper-left corner // int nWidthSrc, // width of source rectangle // int nHeightSrc, // height of source rectangle // UINT crTransparent // color to make transparent // ); //static volatile pMsimg32_TransparentBlt_t pMsimg32_TransparentBlt = NULL; void CExtPaintManager::stat_TransparentBlt( HDC hdcDest, // handle to destination DC int nXOriginDest, // x-coord of destination upper-left corner int nYOriginDest, // y-coord of destination upper-left corner int nWidthDest, // width of destination rectangle int hHeightDest, // height of destination rectangle HDC hdcSrc, // handle to source DC int nXOriginSrc, // x-coord of source upper-left corner int nYOriginSrc, // y-coord of source upper-left corner int nWidthSrc, // width of source rectangle int nHeightSrc, // height of source rectangle UINT crTransparent // color to make transparent ) { ASSERT( hdcDest != NULL && hdcSrc != NULL ); CDC * pDcDest = CDC::FromHandle( hdcDest ); ASSERT( pDcDest != NULL ); CExtMemoryDC dcmm( pDcDest ), dcmsk( pDcDest, NULL, CExtMemoryDC::MDCOPT_TO_MEMORY |CExtMemoryDC::MDCOPT_FORCE_BLACK ) ; if( ( nWidthDest != nWidthSrc || hHeightDest != nHeightSrc ) && nWidthDest >= 0 && hHeightDest >= 0 ) { VERIFY( ::StretchBlt( dcmm.GetSafeHdc(), 0, 0, nWidthDest, hHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY ) ); } else { VERIFY( ::BitBlt( dcmm.GetSafeHdc(), 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY ) ); } int nRealWidthDest = (nWidthDest < 0) ? nWidthSrc : nWidthDest; int nRealHeightDest = (hHeightDest < 0) ? nHeightSrc : hHeightDest; dcmm.SetBkColor( crTransparent ); VERIFY( dcmsk.BitBlt( 0, 0, nRealWidthDest, nRealHeightDest, &dcmm, 0, 0, SRCCOPY ) ); dcmm.SetBkColor( RGB(0,0,0) ); dcmm.SetTextColor( RGB(255,255,255) ); VERIFY( dcmm.BitBlt( 0, 0, nRealWidthDest, nRealHeightDest, &dcmsk, 0, 0, SRCAND ) ); COLORREF clrBkOld = ::SetBkColor( hdcDest, RGB(255,255,255) ); COLORREF clrTextOld = ::SetTextColor( hdcDest, RGB(0,0,0) ); VERIFY( ::BitBlt( hdcDest, nXOriginDest, nYOriginDest, nRealWidthDest, nRealHeightDest, dcmsk.GetSafeHdc(), 0, 0, SRCAND ) ); VERIFY( ::BitBlt( hdcDest, nXOriginDest, nYOriginDest, nRealWidthDest, nRealHeightDest, dcmm.GetSafeHdc(), 0, 0, SRCPAINT ) ); dcmm.__Flush( FALSE ); dcmsk.__Flush( FALSE ); ::SetBkColor( hdcDest, clrBkOld ); ::SetTextColor( hdcDest, clrTextOld ); } // generate DIB for UI light brush (when BPP <= 8 ) HBITMAP CExtPaintManager::stat_GenLBDIB( COLORREF clrDarker, // = COLORREF(-1) // by default COLORREF(-1) is changed to ::GetSysColor(COLOR_BTNFACE) COLORREF clrLighter, // = COLORREF(-1) // by default COLORREF(-1) is changed to ::GetSysColor(COLOR_BTNHIGHLIGHT) int nColorMaskHorz, // = 1 int nColorMaskVert, // = 1 int nSkipMaskHorz, // = 0 int nSkipMaskVert, // = 0 COLORREF clrSkip // = COLORREF(-1L) // // default COLORREF(-1) is changed to clrDarker ) { if( clrSkip == COLORREF(-1L) ) clrSkip = clrDarker; CWindowDC dcAlign( NULL ); CDC dc; if( !dc.CreateCompatibleDC( &dcAlign ) ) { ASSERT( FALSE ); return NULL; } CBitmap bmp; if( !bmp.CreateCompatibleBitmap( &dcAlign, 16, 16 ) ) { ASSERT( FALSE ); return NULL; } CBitmap * pOldBmp = dc.SelectObject( &bmp ); COLORREF clrEffectiveDarker = ( clrDarker == COLORREF(-1) ) ? ( ::GetSysColor( COLOR_BTNFACE ) ) : clrDarker ; COLORREF clrEffectiveLighter = ( clrLighter == COLORREF(-1) ) ? ( ::GetSysColor( COLOR_BTNHIGHLIGHT ) ) : clrLighter ; for( int nY = 0; nY < 16; nY++ ) { for( int nX = 0; nX < 16; nX++ ) { if( (nX & nSkipMaskHorz) != 0 || (nY & nSkipMaskVert) != 0 ) { dc.SetPixel( nX, nY, clrSkip ); continue; } COLORREF clr = ( (nY&nColorMaskVert) != 0 ) ? ( ( (nX&nColorMaskHorz) != 0 ) ? clrEffectiveDarker : clrEffectiveLighter ) : ( ( (nX&nColorMaskHorz) != 0 ) ? clrEffectiveLighter : clrEffectiveDarker ) ; dc.SetPixel( nX, nY, clr ); } } dc.SelectObject( pOldBmp ); return (HBITMAP)bmp.Detach(); } void CExtPaintManager::stat_PaintGradientRect( CDC & dc, const CRect & rcPaintGradient, COLORREF clrLeft, COLORREF clrRight, bool bHorz, // = false UINT nCountOfSteps // = 256 ) { if( rcPaintGradient.left >= rcPaintGradient.right || rcPaintGradient.top >= rcPaintGradient.bottom ) return; ASSERT( nCountOfSteps > 0 && nCountOfSteps <= 256 ); UINT nWidth = rcPaintGradient.Width(); UINT nHeight = rcPaintGradient.Height(); if( bHorz ) { if( nCountOfSteps > nHeight ) nCountOfSteps = nHeight; } else { if( nCountOfSteps > nWidth ) nCountOfSteps = nWidth; } int nBitsPerPixel = stat_GetBPP(); if( nBitsPerPixel <= 8 ) { UINT nCalcStepSize = bHorz ? nHeight / nCountOfSteps : nWidth / nCountOfSteps ; static const UINT nLowColorStepMinSize = 4; if( nCalcStepSize < nLowColorStepMinSize ) nCountOfSteps = bHorz ? nHeight / nLowColorStepMinSize : nWidth / nLowColorStepMinSize ; } // if( nBitsPerPixel <= 8 ) CRect rcItem( rcPaintGradient ); for( UINT nStep = 0, nBackStep = nCountOfSteps; nStep < nCountOfSteps; nStep++, nBackStep-- ) { COLORREF clrItem = RGB( ( GetRValue(clrLeft)*nBackStep + GetRValue(clrRight)*nStep ) / nCountOfSteps, ( GetGValue(clrLeft)*nBackStep + GetGValue(clrRight)*nStep ) / nCountOfSteps, ( GetBValue(clrLeft)*nBackStep + GetBValue(clrRight)*nStep ) / nCountOfSteps ); if( bHorz ) { rcItem.top = rcPaintGradient.bottom - MulDiv( nStep, nHeight, nCountOfSteps ) ; rcItem.top--; if( nStep == nCountOfSteps && rcItem.top < rcPaintGradient.top ) { rcItem.top = rcPaintGradient.top; if( rcItem.top >= rcItem.bottom ) break; } ASSERT( rcItem.Height() >= 1 ); if( nBitsPerPixel <= 8 ) { CBrush br( clrItem ); dc.FillRect( rcItem, &br ); } // if( nBitsPerPixel <= 8 ) else { dc.FillSolidRect( rcItem, clrItem ); } // else from if( nBitsPerPixel <= 8 ) rcItem.bottom = rcItem.top; } else { rcItem.right = MulDiv( nStep, nWidth, nCountOfSteps ) + rcPaintGradient.left ; rcItem.right++; if( nStep == nCountOfSteps && rcItem.right > rcPaintGradient.right ) { rcItem.right = rcPaintGradient.right; if( rcItem.right <= rcItem.left ) break; } ASSERT( rcItem.Width() >= 1 ); if( nBitsPerPixel <= 8 ) { CBrush br( clrItem ); dc.FillRect( rcItem, &br ); } // if( nBitsPerPixel <= 8 ) else { dc.FillSolidRect( rcItem, clrItem ); } // else from if( nBitsPerPixel <= 8 ) rcItem.left = rcItem.right; } } } static int CALLBACK stat_FindFontByNameCallBack( ENUMLOGFONT * pEnumLogFont, NEWTEXTMETRIC * pNewTextMetric, DWORD dwFontType, LPARAM lParam // zero terminated string ) { ASSERT( pEnumLogFont != NULL ); pNewTextMetric; dwFontType; __EXT_MFC_SAFE_LPCTSTR sFontToFind = reinterpret_cast < const TCHAR * > ( lParam ); ASSERT( sFontToFind != NULL ); return _tcsicoll( pEnumLogFont->elfLogFont.lfFaceName, sFontToFind ); } static HFONT stat_menu_HFONT_from_current_NONCLIENTMETRICS( bool bUseTahomaFont ) { NONCLIENTMETRICS _ncNfo; memset( &_ncNfo, 0, sizeof(NONCLIENTMETRICS) ); _ncNfo.cbSize = sizeof(NONCLIENTMETRICS); if( !SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof(_ncNfo), &_ncNfo, 0 ) ) { return NULL; } _ncNfo.lfMenuFont.lfCharSet = (BYTE)GetTextCharset( NULL ); if( bUseTahomaFont ) { static __EXT_MFC_SAFE_LPCTSTR g_sTahoma = _T("Tahoma"); if( !EnumFontFamilies( NULL, NULL, (FONTENUMPROC)stat_FindFontByNameCallBack, reinterpret_cast < LPARAM > ( LPCTSTR( g_sTahoma ) ) ) ) { _tcscpy( _ncNfo.lfMenuFont.lfFaceName, g_sTahoma ); } } // if( bUseTahomaFont ) return CreateFontIndirect( &_ncNfo.lfMenuFont ); } void CExtPaintManager::SyncSysColors() { ASSERT( this != NULL ); g_PaintManager.InitUserExApi(); // init fonts HFONT hDefaultGuiFont = stat_menu_HFONT_from_current_NONCLIENTMETRICS( m_bUseTahomaFont ); if( hDefaultGuiFont == NULL ) hDefaultGuiFont = (HFONT)::GetStockObject( DEFAULT_GUI_FONT ); if( hDefaultGuiFont == NULL ) hDefaultGuiFont = (HFONT)::GetStockObject( SYSTEM_FONT ); ASSERT( hDefaultGuiFont != NULL ); if( m_FontNormal.GetSafeHandle() ) m_FontNormal.DeleteObject(); m_FontNormal.Attach( hDefaultGuiFont ); static __EXT_MFC_SAFE_LPCTSTR sVertFontFaceForNt4 = _T("Arial"); LOGFONT lf; VERIFY( m_FontNormal.GetLogFont(&lf) ); lf.lfWeight = 900; if( m_FontBold.GetSafeHandle() ) m_FontBold.DeleteObject(); VERIFY( m_FontBold.CreateFontIndirect(&lf) ); VERIFY( m_FontNormal.GetLogFont(&lf) ); lf.lfCharSet = SYMBOL_CHARSET; lf.lfWeight = 0; lf.lfHeight = ::GetSystemMetrics(SM_CYMENUCHECK) - 1; _tcscpy( lf.lfFaceName, _T("Marlett") ); if( m_FontMarlett.GetSafeHandle() ) m_FontMarlett.DeleteObject(); VERIFY( m_FontMarlett.CreateFontIndirect(&lf) ); VERIFY( m_FontNormal.GetLogFont(&lf) ); lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT__; if( m_FontNormalVert.GetSafeHandle() ) m_FontNormalVert.DeleteObject(); if( g_PaintManager.m_bIsWinNT4 || g_PaintManager.m_bIsWin9x ) _tcscpy( lf.lfFaceName, sVertFontFaceForNt4 ); VERIFY( m_FontNormalVert.CreateFontIndirect(&lf) ); lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT_X__; if( m_FontNormalVertX.GetSafeHandle() ) m_FontNormalVertX.DeleteObject(); if( g_PaintManager.m_bIsWinNT4 || g_PaintManager.m_bIsWin9x ) _tcscpy( lf.lfFaceName, sVertFontFaceForNt4 ); VERIFY( m_FontNormalVertX.CreateFontIndirect(&lf) ); VERIFY( m_FontBold.GetLogFont(&lf) ); lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT__; if( m_FontBoldVert.GetSafeHandle() ) m_FontBoldVert.DeleteObject(); if( g_PaintManager.m_bIsWinNT4 || g_PaintManager.m_bIsWin9x ) _tcscpy( lf.lfFaceName, sVertFontFaceForNt4 ); VERIFY( m_FontBoldVert.CreateFontIndirect(&lf) ); lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT_X__; if( m_FontBoldVertX.GetSafeHandle() ) m_FontBoldVertX.DeleteObject(); if( g_PaintManager.m_bIsWinNT4 || g_PaintManager.m_bIsWin9x ) _tcscpy( lf.lfFaceName, sVertFontFaceForNt4 ); VERIFY( m_FontBoldVertX.CreateFontIndirect(&lf) ); CFont * arrBarCaptFonts[6*2] = { &m_FontNormalBC, &m_FontNormal, &m_FontNormalVertBC, &m_FontNormalVert, &m_FontNormalVertXBC, &m_FontNormalVertX, &m_FontBoldBC, &m_FontBold, &m_FontBoldVertBC, &m_FontBoldVert, &m_FontBoldVertXBC, &m_FontBoldVertX }; for( int i = 0; i < sizeof(arrBarCaptFonts)/sizeof(arrBarCaptFonts[0]); i += 2 ) { CFont * pFontSrc = arrBarCaptFonts[i+1]; ASSERT( pFontSrc->GetSafeHandle() != NULL ); CFont * pFontDst = arrBarCaptFonts[i]; if( pFontDst->GetSafeHandle() != NULL ) pFontDst->DeleteObject(); VERIFY( pFontSrc->GetLogFont(&lf) ); if( lf.lfHeight < -11 ) lf.lfHeight = -11; VERIFY( pFontDst->CreateFontIndirect(&lf) ); } /// init colors COLORREF clrDefaultExtendColor = ::GetSysColor( COLOR_3DFACE ); for( i = m_colors.GetSize(); i <= __ExtMfc_MAX_SYS_COLOR_VAL; i++ ) { m_colors.Add( clrDefaultExtendColor ); } HBRUSH hDefaultExtendBrush = ::GetSysColorBrush( COLOR_3DFACE ); for( i = m_brushes.GetSize(); i <= __ExtMfc_MAX_SYS_COLOR_VAL; i++ ) { m_brushes.Add( hDefaultExtendBrush ); } //m_colors.clear(); //m_brushes.clear(); for( i = __ExtMfc_MIN_SYS_COLOR_VAL; i <= __ExtMfc_MAX_SYS_COLOR_VAL; i++ ) { m_colors[i] = ::GetSysColor( i ); m_brushes[i] = ::GetSysColorBrush( i ); } ASSERT( m_colors.GetSize() >= __ExtMfc_MAX_SYS_COLOR_VAL+1 ); ASSERT( m_brushes.GetSize() >= __ExtMfc_MAX_SYS_COLOR_VAL+1 ); if( m_brushLightDefault.GetSafeHandle() != NULL ) m_brushLightDefault.DeleteObject(); if( m_brushLightSystem.GetSafeHandle() != NULL ) m_brushLightSystem.DeleteObject(); if( m_brushDarkDefault.GetSafeHandle() != NULL ) m_brushDarkDefault.DeleteObject(); if( m_brushDarkSystem.GetSafeHandle() != NULL ) m_brushDarkSystem.DeleteObject(); if( m_brushLighterDefault.GetSafeHandle() != NULL ) m_brushLighterDefault.DeleteObject(); if( m_brushLighterSystem.GetSafeHandle() != NULL ) m_brushLighterSystem.DeleteObject(); if( m_brushDarkerDefault.GetSafeHandle() != NULL ) m_brushDarkerDefault.DeleteObject(); if( m_brushDarkerSystem.GetSafeHandle() != NULL ) m_brushDarkerSystem.DeleteObject(); if( m_brushLightestDefault.GetSafeHandle() != NULL ) m_brushLightestDefault.DeleteObject(); if( m_brushLightestSystem.GetSafeHandle() != NULL ) m_brushLightestSystem.DeleteObject(); if( m_brushDarkestDefault.GetSafeHandle() != NULL ) m_brushDarkestDefault.DeleteObject(); if( m_brushDarkestSystem.GetSafeHandle() != NULL ) m_brushDarkestSystem.DeleteObject(); int nBitsPerPixel = stat_GetBPP(); if( nBitsPerPixel > 8 ) { COLORREF clrDarker = GetColor( COLOR_3DFACE ); COLORREF clrLighter = GetColor( COLOR_3DHILIGHT ); COLORREF clrMixed = RGB ( GetRValue(clrDarker) + ((GetRValue(clrLighter) - GetRValue(clrDarker)) / 2), GetGValue(clrDarker) + ((GetGValue(clrLighter) - GetGValue(clrDarker)) / 2), GetBValue(clrDarker) + ((GetBValue(clrLighter) - GetBValue(clrDarker)) / 2) ); m_brushLightDefault.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),3,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),3,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),3,5) ); m_brushLighterDefault.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),4,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),4,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),4,5) ); m_brushLightestDefault.CreateSolidBrush( clrMixed ); clrLighter = clrDarker; clrDarker = GetColor( COLOR_3DSHADOW ); clrMixed = RGB ( GetRValue(clrDarker) + ((GetRValue(clrLighter) - GetRValue(clrDarker)) / 2 ), GetGValue(clrDarker) + ((GetGValue(clrLighter) - GetGValue(clrDarker)) / 2), GetBValue(clrDarker) + ((GetBValue(clrLighter) - GetBValue(clrDarker)) / 2) ); m_brushDarkDefault.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),2,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),2,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),2,5) ); m_brushDarkerDefault.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),1,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),1,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),1,5) ); m_brushDarkestDefault.CreateSolidBrush( clrMixed ); clrDarker = ::GetSysColor( COLOR_3DFACE ); clrLighter = ::GetSysColor( COLOR_3DHILIGHT ); clrMixed = RGB ( GetRValue(clrDarker) + ((GetRValue(clrLighter) - GetRValue(clrDarker)) / 2), GetGValue(clrDarker) + ((GetGValue(clrLighter) - GetGValue(clrDarker)) / 2), GetBValue(clrDarker) + ((GetBValue(clrLighter) - GetBValue(clrDarker)) / 2) ); m_brushLightSystem.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),3,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),3,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),3,5) ); m_brushLighterSystem.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),4,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),4,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),4,5) ); m_brushLightestSystem.CreateSolidBrush( clrMixed ); clrLighter = clrDarker; clrDarker = ::GetSysColor( COLOR_3DSHADOW ); clrMixed = RGB ( GetRValue(clrDarker) + ((GetRValue(clrLighter) - GetRValue(clrDarker)) / 2), GetGValue(clrDarker) + ((GetGValue(clrLighter) - GetGValue(clrDarker)) / 2), GetBValue(clrDarker) + ((GetBValue(clrLighter) - GetBValue(clrDarker)) / 2) ); m_brushDarkSystem.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),2,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),2,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),2,5) ); m_brushDarkerSystem.CreateSolidBrush( clrMixed ); clrMixed = RGB ( GetRValue(clrDarker) + ::MulDiv((GetRValue(clrLighter) - GetRValue(clrDarker)),1,5), GetGValue(clrDarker) + ::MulDiv((GetGValue(clrLighter) - GetGValue(clrDarker)),1,5), GetBValue(clrDarker) + ::MulDiv((GetBValue(clrLighter) - GetBValue(clrDarker)),1,5) ); m_brushDarkestSystem.CreateSolidBrush( clrMixed ); } // if( nBitsPerPixel > 8 ) else { CBitmap bmp; COLORREF clrDarker = GetColor( COLOR_3DFACE ); COLORREF clrLighter = GetColor( COLOR_3DHILIGHT ); HBITMAP hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLightDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 1, 1, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLighterDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 2, 2, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLightestDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); clrLighter = clrDarker; clrDarker = GetColor( COLOR_3DSHADOW ); hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 1, 1 ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkerDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); clrLighter = clrDarker; clrDarker = GetColor( COLOR_3DDKSHADOW ); hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkestDefault.CreatePatternBrush( &bmp ); bmp.DeleteObject(); clrDarker = ::GetSysColor( COLOR_3DFACE ); clrLighter = ::GetSysColor( COLOR_3DHILIGHT ); hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLightSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 1, 1, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLighterSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 2, 2, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushLightestSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); clrLighter = clrDarker; clrDarker = ::GetSysColor( COLOR_3DSHADOW ); hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); hBmp = stat_GenLBDIB( clrDarker, clrLighter, 1, 1, 1, 1 ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkerSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); clrLighter = clrDarker; clrDarker = ::GetSysColor( COLOR_3DDKSHADOW ); hBmp = stat_GenLBDIB( clrDarker, clrLighter ); ASSERT( hBmp != NULL ); bmp.Attach( hBmp ); m_brushDarkestSystem.CreatePatternBrush( &bmp ); bmp.DeleteObject(); } // else from if( nBitsPerPixel > 8 ) } // get any system color based brush HBRUSH CExtPaintManager::GetBrush( int nColorIndex ) { int nBrushesCount = m_brushes.GetSize(); if( !( __ExtMfc_MIN_SYS_COLOR_VAL <= nColorIndex && nColorIndex < nBrushesCount ) ) { ASSERT( FALSE ); nColorIndex = COLOR_3DFACE; } HBRUSH hBrush = m_brushes[nColorIndex]; return hBrush; } COLORREF CExtPaintManager::GetColor(int nColorIndex) { ASSERT( this != NULL ); if( nColorIndex >= __ExtMfc_COLOR_MAP_BASE ) { int nColorIndex2 = 0; if( m_mapColorTranslate.Lookup( nColorIndex, nColorIndex2 ) ) nColorIndex = nColorIndex2; else { ASSERT( FALSE ); nColorIndex = COLOR_3DFACE; } } int nColorCount = m_colors.GetSize(); if( !( __ExtMfc_MIN_SYS_COLOR_VAL <= nColorIndex && nColorIndex < nColorCount // <= __ExtMfc_MAX_SYS_COLOR_VAL ) ) { ASSERT( FALSE ); nColorIndex = COLOR_3DFACE; } COLORREF clr = m_colors[nColorIndex]; return clr; } int CExtPaintManager::InstallColor( COLORREF clr, int nColorIndex // = -1 ) { ASSERT( this != NULL ); int nColorCount = m_colors.GetSize(); if( nColorIndex < 0 || nColorIndex >= nColorCount ) { nColorIndex = m_colors.Add( clr ); } else m_colors[nColorIndex] = clr; return nColorIndex; } void CExtPaintManager::InitTranslatedColors() { ASSERT( this != NULL ); m_mapColorTranslate.RemoveAll(); m_mapColorTranslate[CLR_3DFACE_OUT] = COLOR_3DFACE; m_mapColorTranslate[CLR_3DFACE_IN] = COLOR_3DFACE; m_mapColorTranslate[CLR_3DFACE_DISABLED] = COLOR_3DFACE; m_mapColorTranslate[CLR_3DLIGHT_OUT] = COLOR_3DLIGHT; m_mapColorTranslate[CLR_3DLIGHT_IN] = COLOR_3DLIGHT; m_mapColorTranslate[CLR_3DLIGHT_DISABLED] = COLOR_3DLIGHT; m_mapColorTranslate[CLR_3DHILIGHT_OUT] = COLOR_3DHILIGHT; m_mapColorTranslate[CLR_3DHILIGHT_IN] = COLOR_3DHILIGHT; m_mapColorTranslate[CLR_3DHILIGHT_DISABLED] = COLOR_3DHILIGHT; m_mapColorTranslate[CLR_3DSHADOW_OUT] = COLOR_3DSHADOW; m_mapColorTranslate[CLR_3DSHADOW_IN] = COLOR_3DSHADOW; m_mapColorTranslate[CLR_3DSHADOW_DISABLED] = COLOR_3DSHADOW; m_mapColorTranslate[CLR_3DDKSHADOW_OUT] = COLOR_3DDKSHADOW; m_mapColorTranslate[CLR_3DDKSHADOW_IN] = COLOR_3DDKSHADOW; m_mapColorTranslate[CLR_3DDKSHADOW_DISABLED] = COLOR_3DDKSHADOW; m_mapColorTranslate[CLR_TEXT_OUT] = COLOR_BTNTEXT; m_mapColorTranslate[CLR_TEXT_IN] = COLOR_BTNTEXT; m_mapColorTranslate[CLR_TEXT_DISABLED] = COLOR_3DSHADOW; } static const UINT stat_pixels_dock_btn_empty[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_close[] = { 0,0,0,0,0,0,0,0,0, 0,1,1,0,0,0,0,1,1, 0,0,1,1,0,0,1,1,0, 0,0,0,1,1,1,1,0,0, 0,0,0,0,1,1,0,0,0, 0,0,0,1,1,1,1,0,0, 0,0,1,1,0,0,1,1,0, 0,1,1,0,0,0,0,1,1, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_close_dc2k[] = { 0,0,0,0,0,0,0,0,0, 0,1,1,0,0,0,1,1,0, 0,0,1,1,0,1,1,0,0, 0,0,0,1,1,1,0,0,0, 0,0,0,1,1,1,0,0,0, 0,0,1,1,0,1,1,0,0, 0,1,1,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_thin_close[] = { 0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,1,0, 0,0,1,0,0,0,1,0,0, 0,0,0,1,0,1,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,1,0,1,0,0,0, 0,0,1,0,0,0,1,0,0, 0,1,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_arrow_up[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,1,1,1,0,0,0, 0,0,1,1,1,1,1,0,0, 0,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_hollow_up[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,1,0,1,0,0,0, 0,0,1,0,0,0,1,0,0, 0,1,0,0,0,0,0,1,0, 1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_arrow_up_l[] = { 0,0,0,0,1,0,0,0,0, 0,0,0,1,1,1,0,0,0, 0,0,1,1,1,1,1,0,0, 0,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1, 0,0,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,0,0, 0,0,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_wnd_minimize[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_wnd_restore[] = { 0,0,1,1,1,1,1,1,0, 0,0,1,0,0,0,0,1,0, 1,1,1,1,1,1,0,1,0, 1,1,1,1,1,1,0,1,0, 1,0,0,0,0,1,1,1,0, 1,0,0,0,0,1,0,0,0, 1,0,0,0,0,1,0,0,0, 1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_wnd_maximize[] = { 1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; static const UINT stat_pixels_dock_wnd_keep[] = { 0,0,1,1,1,1,1,0,0, 0,0,1,0,0,1,1,0,0, 0,0,1,0,0,1,1,0,0, 0,0,1,0,0,1,1,0,0, 0,0,1,0,0,1,1,0,0, 0,1,1,1,1,1,1,1,0, 0,0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_dock_btn_contexthelp[] = { 0,0,0,1,1,1,1,0,0, 0,0,1,1,0,0,1,1,0, 0,0,1,1,0,0,1,1,0, 0,0,0,0,0,1,1,0,0, 0,0,0,0,1,1,0,0,0, 0,0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0,0, 0,0,0,0,1,1,0,0,0, }; static const UINT stat_pixels_hollow_plus[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,1,1,1,1,1,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_hollow_minus[] = { 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_tree_plus[] = { 1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,1,0,0,0,1, 1,0,0,0,1,0,0,0,1, 1,0,1,1,1,1,1,0,1, 1,0,0,0,1,0,0,0,1, 1,0,0,0,1,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; static const UINT stat_pixels_tree_minus[] = { 1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,1,1,1,1,1,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; static const UINT stat_pixels_circle_plus[] = { 0,0,1,1,1,1,1,0,0, 0,1,0,0,0,0,0,1,0, 1,0,0,0,1,0,0,0,1, 1,0,0,0,1,0,0,0,1, 1,0,1,1,1,1,1,0,1, 1,0,0,0,1,0,0,0,1, 1,0,0,0,1,0,0,0,1, 0,1,0,0,0,0,0,1,0, 0,0,1,1,1,1,1,0,0, }; static const UINT stat_pixels_circle_minus[] = { 0,0,1,1,1,1,1,0,0, 0,1,0,0,0,0,0,1,0, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 1,0,1,1,1,1,1,0,1, 1,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,1, 0,1,0,0,0,0,0,1,0, 0,0,1,1,1,1,1,0,0, }; static const UINT stat_pixels_arrow_pt_up[] = { 0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,0,0, 0,1,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1,1, 0,0,0,1,1,1,1,1,0,0,0, 0,0,0,1,1,1,1,1,0,0,0, 0,0,0,1,1,1,1,1,0,0,0, 0,0,0,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_arrow_pt_lt[] = { 1,1,1,1,1,1,1,1,0,0,0, 1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,0,0,0,0,0, 1,1,1,1,1,1,0,0,0,0,0, 1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,1,0,0,0, 1,1,0,0,1,1,1,1,1,0,0, 1,0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0, }; static const UINT stat_pixels_arrow_small_up[] = { 0,0,1,0,0, 0,1,1,1,0, 1,1,1,1,1, }; static const UINT stat_pixels_ellipsis[] = { 0,0,0,0,0,0,0,0,0, 0,1,0,0,1,0,0,1,0, 0,0,0,0,0,0,0,0,0, }; static CExtPaintManager::glyph_t stat_glyph_dock_empty( 9,9,2, stat_pixels_dock_btn_empty ); static CExtPaintManager::glyph_t stat_glyph_dock_close( 9,9,2, stat_pixels_dock_btn_close ); static CExtPaintManager::glyph_t stat_glyph_dock_close_dc2k( 9,9,2, stat_pixels_dock_btn_close_dc2k ); static CExtPaintManager::glyph_t stat_glyph_dock_xp_thin_close( 9,9,2, stat_pixels_dock_btn_thin_close ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_up( 9,9,2, stat_pixels_dock_btn_arrow_up ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_down( stat_glyph_dock_arrow_up, 180 ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_left( stat_glyph_dock_arrow_up, 270 ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_right( stat_glyph_dock_arrow_left, 180 ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_minimize( 9,9,2, stat_pixels_dock_wnd_minimize ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_restore( 9,9,2, stat_pixels_dock_wnd_restore ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_maximize( 9,9,2, stat_pixels_dock_wnd_maximize ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_keep( 9,9,2, stat_pixels_dock_wnd_keep ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_unkeep( stat_glyph_dock_wnd_keep, 90 ); static CExtPaintManager::glyph_t stat_glyph_dock_wnd_contexthelp( 9,9,2, stat_pixels_dock_btn_contexthelp ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_up_l( 9,9,2, stat_pixels_dock_btn_arrow_up_l ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_down_l( stat_glyph_dock_arrow_up_l, 180 ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_left_l( stat_glyph_dock_arrow_up_l, 270 ); static CExtPaintManager::glyph_t stat_glyph_dock_arrow_right_l( stat_glyph_dock_arrow_left_l, 180 ); static CExtPaintManager::glyph_t stat_glyph_dock_hollow_up( 9,9,2, stat_pixels_dock_btn_hollow_up ); static CExtPaintManager::glyph_t stat_glyph_dock_hollow_down( stat_glyph_dock_hollow_up, 180 ); static CExtPaintManager::glyph_t stat_glyph_dock_hollow_left( stat_glyph_dock_hollow_up, 270 ); static CExtPaintManager::glyph_t stat_glyph_dock_hollow_right( stat_glyph_dock_hollow_left, 180 ); static CExtPaintManager::glyph_t stat_glyph_hollow_plus( 9,9,2, stat_pixels_hollow_plus ); static CExtPaintManager::glyph_t stat_glyph_hollow_minus( 9,9,2, stat_pixels_hollow_minus ); static CExtPaintManager::glyph_t stat_glyph_tree_plus( 9,9,2, stat_pixels_tree_plus ); static CExtPaintManager::glyph_t stat_glyph_tree_minus( 9,9,2, stat_pixels_tree_minus ); static CExtPaintManager::glyph_t stat_glyph_circle_plus( 9,9,2, stat_pixels_circle_plus ); static CExtPaintManager::glyph_t stat_glyph_circle_minus( 9,9,2, stat_pixels_circle_minus ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_up( 11,11,2, stat_pixels_arrow_pt_up ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_down( stat_glyph_arrow_pt_up, 180 ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_left( stat_glyph_arrow_pt_up, 270 ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_right( stat_glyph_arrow_pt_left, 180 ); static CExtPaintManager::glyph_t stat_glyph_arrow_small_up( 5,3,2, stat_pixels_arrow_small_up ); static CExtPaintManager::glyph_t stat_glyph_arrow_small_down( stat_glyph_arrow_small_up, 180 ); static CExtPaintManager::glyph_t stat_glyph_arrow_small_left( stat_glyph_arrow_small_up, 270 ); static CExtPaintManager::glyph_t stat_glyph_arrow_small_right( stat_glyph_arrow_small_left, 180 ); static CExtPaintManager::glyph_t stat_glyph_ellipsis( 9,3,2, stat_pixels_ellipsis ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_lt( 11,11,2, stat_pixels_arrow_pt_lt ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_rt( stat_glyph_arrow_pt_lt, 90 ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_rb( stat_glyph_arrow_pt_rt, 90 ); static CExtPaintManager::glyph_t stat_glyph_arrow_pt_lb( stat_glyph_arrow_pt_rb, 90 ); /* static const UINT stat_pixels_arrow_sort_up[] = { 0,0,0,1,1,0,0,0, 0,0,1,3,1,1,0,0, 0,0,3,0,0,1,0,0, 0,1,3,0,0,1,1,0, 0,3,0,0,0,0,1,0, 1,3,0,0,0,0,1,1, 1,2,2,2,2,2,2,2, }; static const UINT stat_pixels_arrow_sort_down[] = { 2,3,3,3,3,3,3,3, 2,2,0,0,0,0,1,1, 0,2,0,0,0,0,3,0, 0,2,2,0,0,1,1,0, 0,0,2,0,0,3,0,0, 0,0,2,2,1,1,0,0, 0,0,0,2,1,0,0,0, }; */ static const UINT stat_pixels_arrow_sort_up[] = { 0,0,0,0,1,1,0,0,0,0, 0,0,0,0,1,1,0,0,0,0, 0,0,0,1,3,1,1,0,0,0, 0,0,0,3,0,0,1,0,0,0, 0,0,1,1,0,0,1,1,0,0, 0,0,3,0,0,0,0,1,0,0, 0,1,1,0,0,0,0,1,1,0, 0,3,0,0,0,0,0,0,1,0, 1,1,0,0,0,0,0,0,1,1, 1,2,2,2,2,2,2,2,2,2, }; static const UINT stat_pixels_arrow_sort_down[] = { 3,3,3,3,3,3,3,3,3,2, 1,1,0,0,0,0,0,0,2,2, 0,3,0,0,0,0,0,0,2,0, 0,1,1,0,0,0,0,2,2,0, 0,0,3,0,0,0,0,2,0,0, 0,0,1,1,0,0,2,2,0,0, 0,0,0,3,0,0,2,0,0,0, 0,0,0,1,3,2,2,0,0,0, 0,0,0,0,1,2,0,0,0,0, 0,0,0,0,1,2,0,0,0,0, }; static CExtPaintManager::glyph_t stat_glyph_arrow_sort_up( 10,10,4, // 8,7,4, stat_pixels_arrow_sort_up ); static CExtPaintManager::glyph_t stat_glyph_arrow_sort_down( 10,10,4, // 8,7,4, stat_pixels_arrow_sort_down ); static CExtPaintManager::glyph_t stat_glyph_arrow_sort_left( stat_glyph_arrow_sort_down, 90 ); static CExtPaintManager::glyph_t stat_glyph_arrow_sort_right( stat_glyph_arrow_sort_up, 90 ); CExtPaintManager::glyph_t * CExtPaintManager::g_DockingCaptionGlyphs[__DCBT_VALUE_MAX+1] = { & stat_glyph_dock_empty, & stat_glyph_dock_close, & stat_glyph_dock_arrow_up, & stat_glyph_dock_arrow_down, & stat_glyph_dock_arrow_left, & stat_glyph_dock_arrow_right, & stat_glyph_dock_wnd_minimize, & stat_glyph_dock_wnd_restore, & stat_glyph_dock_wnd_maximize, & stat_glyph_dock_wnd_contexthelp, & stat_glyph_dock_wnd_keep, & stat_glyph_dock_wnd_unkeep, & stat_glyph_dock_arrow_up_l, & stat_glyph_dock_arrow_down_l, & stat_glyph_dock_arrow_left_l, & stat_glyph_dock_arrow_right_l, & stat_glyph_dock_xp_thin_close, & stat_glyph_dock_hollow_up, & stat_glyph_dock_hollow_down, & stat_glyph_dock_hollow_left, & stat_glyph_dock_hollow_right, & stat_glyph_dock_close_dc2k, & stat_glyph_hollow_plus, & stat_glyph_hollow_minus, & stat_glyph_tree_plus, & stat_glyph_tree_minus, & stat_glyph_circle_plus, & stat_glyph_circle_minus, & stat_glyph_arrow_pt_up, & stat_glyph_arrow_pt_down, & stat_glyph_arrow_pt_left, & stat_glyph_arrow_pt_right, & stat_glyph_arrow_pt_lt, & stat_glyph_arrow_pt_rt, & stat_glyph_arrow_pt_rb, & stat_glyph_arrow_pt_lb, & stat_glyph_arrow_small_up, & stat_glyph_arrow_small_down, & stat_glyph_arrow_small_left, & stat_glyph_arrow_small_right, & stat_glyph_ellipsis, & stat_glyph_arrow_sort_up, & stat_glyph_arrow_sort_down, & stat_glyph_arrow_sort_left, & stat_glyph_arrow_sort_right, }; CExtPaintManager::PAINTDOCKINGCAPTIONBUTTONDATA::PAINTDOCKINGCAPTIONBUTTONDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcClient( 0,0,0,0 ) , m_eType( CExtPaintManager::e_docking_caption_button_t::__DCBT_EMPTY ) , m_bHover( false ) , m_bPushed( false ) , m_bEnabled( false ) , m_bSideBar( false ) , m_bBarWndActive( false ) , m_bFloating( false ) { } CExtPaintManager::PAINTDOCKINGCAPTIONBUTTONDATA::PAINTDOCKINGCAPTIONBUTTONDATA( CObject * pHelperSrc, const RECT & rcClient, int eType, // CExtPaintManager::e_docking_caption_button_t bool bHover, bool bPushed, bool bEnabled, bool bSideBar, bool bBarWndActive, bool bFloating ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcClient( rcClient ) , m_eType( eType ) , m_bHover( bHover ) , m_bPushed( bPushed ) , m_bEnabled( bEnabled ) , m_bSideBar( bSideBar ) , m_bBarWndActive( bBarWndActive ) , m_bFloating( bFloating ) { } void CExtPaintManager::PaintDockingCaptionButton( CDC & dc, CExtPaintManager::PAINTDOCKINGCAPTIONBUTTONDATA & _pdcbd ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( __DCBT_VALUE_MIN <= _pdcbd.m_eType && _pdcbd.m_eType <= __DCBT_VALUE_MAX ); if( _pdcbd.m_rcClient.IsRectEmpty() ) return; bool bHover = _pdcbd.m_bHover; if( !_pdcbd.m_bEnabled ) bHover = false; COLORREF ColorValues[2] = { RGB(0,0,0), RGB(0,0,0), }; COLORREF clr3dFace = GetColor( COLOR_3DFACE ); COLORREF clr3dShadow = GetColor( COLOR_3DSHADOW ); COLORREF clr3dDkShadow = GetColor( COLOR_3DDKSHADOW ); COLORREF clr3dHiLight = GetColor( COLOR_3DHILIGHT ); if( !_pdcbd.m_bEnabled ) ColorValues[1] = clr3dShadow; CRect rcGlyph( _pdcbd.m_rcClient ); rcGlyph.NormalizeRect(); if( rcGlyph.Width() & 1 ) rcGlyph.left++; if( rcGlyph.Height() & 1 ) rcGlyph.top++; if( _pdcbd.m_eType == __DCBT_CLOSE ) _pdcbd.m_eType = __DCBT_CLOSE_DC2K; glyph_t * pGlyph = g_DockingCaptionGlyphs[_pdcbd.m_eType]; ASSERT( pGlyph != NULL ); if( !_pdcbd.m_bFloating ) // rcGlyph.InflateRect( 2, 2 ); // else rcGlyph.InflateRect( 1, 1 ); rcGlyph.InflateRect( 1, 1, 0, 0 ); dc.FillSolidRect( &rcGlyph, clr3dFace ); CRect rcGlyphShape( rcGlyph ); if( _pdcbd.m_bPushed ) rcGlyphShape.OffsetRect( 1, 1 ); PaintGlyphCentered( dc, rcGlyphShape, *pGlyph, ColorValues ); /* if( bEnabled && bPushed ) { dc.Draw3dRect( &rcGlyph, clr3dDkShadow, clr3dFace ); rcGlyph.DeflateRect( 1, 1 ); dc.Draw3dRect( &rcGlyph, clr3dShadow, clr3dHiLight ); } // if( bPushed ) else { dc.Draw3dRect( &rcGlyph, clr3dFace, clr3dDkShadow ); rcGlyph.DeflateRect( 1, 1 ); dc.Draw3dRect( &rcGlyph, clr3dHiLight, clr3dShadow ); } // else if( bHover ) */ if( _pdcbd.m_bEnabled && _pdcbd.m_bPushed ) { dc.Draw3dRect( &rcGlyph, clr3dShadow, clr3dHiLight ); } // if( _pdcbd.m_bEnabled && _pdcbd.m_bPushed ) else if( _pdcbd.m_bEnabled && bHover ) { dc.Draw3dRect( &rcGlyph, clr3dFace, clr3dDkShadow ); rcGlyph.DeflateRect( 1, 1 ); dc.Draw3dRect( &rcGlyph, clr3dHiLight, clr3dShadow ); } // else if( _pdcbd.m_bEnabled && bHover ) else { dc.Draw3dRect( &rcGlyph, clr3dHiLight, clr3dShadow ); } // else ... } void CExtPaintManagerXP::PaintDockingCaptionButton( CDC & dc, CExtPaintManager::PAINTDOCKINGCAPTIONBUTTONDATA & _pdcbd ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( __DCBT_VALUE_MIN <= _pdcbd.m_eType && _pdcbd.m_eType <= __DCBT_VALUE_MAX ); if( _pdcbd.m_rcClient.IsRectEmpty() ) return; bool bHover = _pdcbd.m_bHover; if( !_pdcbd.m_bEnabled ) bHover = false; COLORREF ColorValues[2] = { RGB(0,0,0), RGB(0,0,0), }; if( _pdcbd.m_bEnabled ) { if( ! (bHover || _pdcbd.m_bPushed) ) ColorValues[1] = GetColor( _pdcbd.m_bSideBar ? (_pdcbd.m_bBarWndActive ? COLOR_HIGHLIGHTTEXT : COLOR_3DDKSHADOW // COLOR_BTNTEXT ) : COLOR_3DHILIGHT ); } // if( bEnabled ) else { ColorValues[1] = GetColor( COLOR_3DSHADOW // COLOR_3DFACE ); } // else from if( bEnabled ) CRect rcGlyph( _pdcbd.m_rcClient ); rcGlyph.NormalizeRect(); if( bHover || _pdcbd.m_bPushed ) { dc.FillSolidRect( &rcGlyph, //clr3dHilight GetColor( _pdcbd.m_bPushed ? XPCLR_HILIGHT : CLR_3DFACE_IN ) ); CRect rcBtnBorder(rcGlyph); rcBtnBorder.InflateRect(1,1); COLORREF clrBtnBorder = GetColor( _pdcbd.m_bBarWndActive ? XPCLR_HILIGHT : XPCLR_HILIGHT_BORDER ); dc.Draw3dRect( rcBtnBorder, clrBtnBorder, clrBtnBorder ); } if( rcGlyph.Width() & 1 ) rcGlyph.left++; if( rcGlyph.Height() & 1 ) rcGlyph.top++; int eType = _pdcbd.m_eType; if( _pdcbd.m_bSideBar && !_pdcbd.m_bFloating && eType == __DCBT_CLOSE ) eType = __DCBT_XP_THIN_CLOSE; glyph_t * pGlyph = g_DockingCaptionGlyphs[eType]; ASSERT( pGlyph != NULL ); PaintGlyphCentered( dc, rcGlyph, *pGlyph, ColorValues ); } CExtPaintManager::PAINTPUSHBUTTONDATA::PAINTPUSHBUTTONDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_bHorz( false ) , m_rcClient( 0,0,0,0 ) , m_sText( _T("") ) , m_pIcon( NULL ) , m_bFlat( false ) , m_bHover( false ) , m_bPushed( false ) , m_bIndeterminate( false ) , m_bEnabled( false ) , m_bDrawBorder( false ) , m_bDrawFocusRect( false ) , m_bDefaultPushButton( false ) , m_eAlign( __ALIGN_VERT ) , m_hFont( NULL ) , m_bDropDown( false ) , m_nHelperSysCmdID( 0 ) , m_bTransparentBackground( false ) , m_bSeparatedDropDown( false ) , m_bPushedDropDown( false ) , m_clrForceTextDisabled( ((COLORREF)-1L) ) , m_clrForceTextNormal( ((COLORREF)-1L) ) , m_clrForceTextHover( ((COLORREF)-1L) ) , m_clrForceTextPressed( ((COLORREF)-1L) ) , m_nDrawTextFlagsH( DT_SINGLELINE|DT_CENTER|DT_VCENTER ) , m_bForceUseDrawTextApiH( false ) { } CExtPaintManager::PAINTPUSHBUTTONDATA::PAINTPUSHBUTTONDATA( CObject * pHelperSrc, bool bHorz, const RECT & rcClient, __EXT_MFC_SAFE_LPCTSTR sText, CExtCmdIcon * pIcon, bool bFlat, bool bHover, bool bPushed, bool bIndeterminate, bool bEnabled, bool bDrawBorder, bool bDrawFocusRect, bool bDefaultPushButton, int eAlign, HFONT hFont, // = NULL bool bDropDown, // = false UINT nHelperSysCmdID, // = 0 bool bTransparentBackground // = false ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_bHorz( bHorz ) , m_rcClient( rcClient ) , m_sText( (sText==NULL) ? _T("") : sText ) , m_pIcon( pIcon ) , m_bFlat( bFlat ) , m_bHover( bHover ) , m_bPushed( bPushed ) , m_bIndeterminate( bIndeterminate ) , m_bEnabled( bEnabled ) , m_bDrawBorder( bDrawBorder ) , m_bDrawFocusRect( bDrawFocusRect ) , m_bDefaultPushButton( bDefaultPushButton ) , m_eAlign( eAlign ) , m_hFont( hFont ) , m_bDropDown( bDropDown ) , m_nHelperSysCmdID( nHelperSysCmdID ) , m_bTransparentBackground( bTransparentBackground ) , m_bSeparatedDropDown( false ) , m_bPushedDropDown( false ) , m_clrForceTextDisabled( ((COLORREF)-1L) ) , m_clrForceTextNormal( ((COLORREF)-1L) ) , m_clrForceTextHover( ((COLORREF)-1L) ) , m_clrForceTextPressed( ((COLORREF)-1L) ) , m_nDrawTextFlagsH( DT_SINGLELINE|DT_CENTER|DT_VCENTER ) , m_bForceUseDrawTextApiH( false ) { } void CExtPaintManager::PaintPushButton( CDC & dc, CExtPaintManager::PAINTPUSHBUTTONDATA & _ppbd ) { if( _ppbd.m_rcClient.IsRectEmpty() ) return; if( !_ppbd.m_bEnabled ) { _ppbd.m_bHover = false; //_ppbd.m_bDrawBorder = false; _ppbd.m_bDrawFocusRect = false; _ppbd.m_bIndeterminate = false; } if( _ppbd.m_bSeparatedDropDown && (_ppbd.m_bPushed || _ppbd.m_bPushedDropDown) ) _ppbd.m_bHover = false; COLORREF clrOldText = dc.GetTextColor(); COLORREF clrOldBk = dc.GetBkColor(); int nOldBkMode = dc.SetBkMode( TRANSPARENT ); // Prepare draw... paint button's area with background color COLORREF bgColor; if( _ppbd.m_bHover || _ppbd.m_bPushed ) bgColor = GetColor(CLR_3DFACE_IN); else bgColor = GetColor(CLR_3DFACE_OUT); CExtSafeString sTitle( _T("") ); if( _ppbd.m_sText != NULL ) sTitle = _ppbd.m_sText; bool bPushedDropDown = false; if( (_ppbd.m_bPushed && !_ppbd.m_bSeparatedDropDown) || _ppbd.m_bPushedDropDown ) bPushedDropDown = true; CRect rectClient( _ppbd.m_rcClient ); CRect rectTotal( _ppbd.m_rcClient ); CRect rectCaption( _ppbd.m_rcClient ); CRect rectDropDown( 0,0,0,0 ); if( _ppbd.m_bDropDown ) { rectDropDown = rectClient; if( _ppbd.m_bHorz ) { rectCaption.right -= __DROPDOWN_ARROW_GAP*2 + g_glyph_btn_expand_bottom.Size().cx ; rectDropDown.left = rectCaption.right; } // if( _ppbd.m_bHorz ) else { rectCaption.bottom -= __DROPDOWN_ARROW_GAP*2 + g_glyph_btn_expand_right.Size().cy ; rectDropDown.top = rectCaption.bottom; } // if( _ppbd.m_bHorz ) if( !_ppbd.m_bTransparentBackground ) { if( _ppbd.m_bEnabled && bPushedDropDown // && _ppbd.m_bPushedDropDown && _ppbd.m_bHover //&& _ppbd.m_bFlat ) dc.FillRect( &rectDropDown, &m_brushLightDefault ); else { CBrush br( bgColor ); dc.FillRect( &rectDropDown, &br ); } } // if( !_ppbd.m_bTransparentBackground ) if( _ppbd.m_bSeparatedDropDown ) { rectClient = rectCaption; if( bPushedDropDown ) { if( _ppbd.m_bFlat ) { if( _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectDropDown, GetColor(CLR_3DSHADOW_IN), GetColor(CLR_3DHILIGHT_IN) ); } // if( _ppbd.m_bFlat ) else dc.Draw3dRect( rectDropDown, GetColor(CLR_3DSHADOW_IN), GetColor(CLR_3DHILIGHT_IN) ); } // if( bPushedDropDown ) else { if( _ppbd.m_bFlat ) { if( _ppbd.m_bHover && _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectDropDown, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } // if( _ppbd.m_bFlat ) else dc.Draw3dRect( rectDropDown, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } // else from if( bPushedDropDown ) } // if( _ppbd.m_bSeparatedDropDown ) } // if( _ppbd.m_bDropDown ) if( !_ppbd.m_bTransparentBackground ) { if( _ppbd.m_bEnabled && _ppbd.m_bPushed && _ppbd.m_bHover //&& _ppbd.m_bFlat ) dc.FillRect( &rectClient, &m_brushLightDefault ); else { CBrush br( bgColor ); dc.FillRect( &rectClient, &br ); } } // if( !_ppbd.m_bTransparentBackground ) // Draw pressed button if( _ppbd.m_bPushed ) { if( _ppbd.m_bFlat ) { if( _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectClient, GetColor(CLR_3DSHADOW_IN), GetColor(CLR_3DHILIGHT_IN) ); } else dc.Draw3dRect( rectClient, GetColor(CLR_3DSHADOW_IN), GetColor(CLR_3DHILIGHT_IN) ); } // if( bPushed ) else // ...else draw non pressed button { if( _ppbd.m_bFlat ) { if( _ppbd.m_bHover && _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectClient, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } // if( _ppbd.m_bFlat ) else { dc.Draw3dRect( rectClient, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); if( _ppbd.m_bHover ) { CRect cc( rectTotal ); dc.Draw3dRect( cc, GetColor(CLR_3DSHADOW_OUT), GetColor(CLR_3DDKSHADOW_OUT) ); cc.DeflateRect(1,1); dc.Draw3dRect( cc, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } // if( _ppbd.m_bHover ) } // else from if( _ppbd.m_bFlat ) } // else from if( _ppbd.m_bPushed ) if( _ppbd.m_bDropDown ) { CRect rectGlyph( rectDropDown ); if( bPushedDropDown ) rectGlyph.OffsetRect( GetPushedOffset() ); COLORREF ColorValues[2] = { RGB(0,0,0), GetColor( _ppbd.m_bEnabled ? ( ( _ppbd.m_clrForceTextNormal == ((COLORREF)-1L) ) ? CLR_TEXT_OUT : _ppbd.m_clrForceTextNormal ) : ( ( _ppbd.m_clrForceTextDisabled == ((COLORREF)-1L) ) ? CLR_3DSHADOW_OUT : _ppbd.m_clrForceTextDisabled ) ) }; PaintGlyphCentered( dc, rectGlyph, _ppbd.m_bHorz ? g_glyph_btn_expand_bottom : g_glyph_btn_expand_right, ColorValues ); } // if( _ppbd.m_bDropDown ) rectClient = rectCaption; // Draw the icon if( rectClient.bottom > rectClient.top && rectClient.right > rectClient.left ) { if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) { PaintIcon( dc, _ppbd.m_bHorz, sTitle, _ppbd.m_pIcon, rectClient, rectCaption, _ppbd.m_bPushed, _ppbd.m_bEnabled, _ppbd.m_bHover, _ppbd.m_eAlign ); } // if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) else { PaintSysCmdGlyph( dc, _ppbd.m_nHelperSysCmdID, rectClient, false, _ppbd.m_bPushed, _ppbd.m_bEnabled ); } // else from if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) } if( rectCaption.bottom > rectCaption.top && rectCaption.right > rectCaption.left ) { // if we have valid area for text & focus rect if( !sTitle.IsEmpty() ) { if( _ppbd.m_bPushed ) { CSize sizePushedOffset = GetPushedOffset(); rectCaption.OffsetRect(sizePushedOffset); } dc.SetBkColor( bgColor ); if( _ppbd.m_bEnabled ) { if( _ppbd.m_bHover || _ppbd.m_bPushed ) { if( _ppbd.m_bPushed && _ppbd.m_clrForceTextPressed != ((COLORREF)-1L) ) dc.SetTextColor( GetColor(_ppbd.m_clrForceTextPressed ) ); else if( _ppbd.m_bHover && _ppbd.m_clrForceTextHover != ((COLORREF)-1L) ) dc.SetTextColor( GetColor(_ppbd.m_clrForceTextHover ) ); else dc.SetTextColor( GetColor(COLOR_3DDKSHADOW) ); } // if( _ppbd.m_bHover || _ppbd.m_bPushed ) else ( _ppbd.m_clrForceTextNormal == ((COLORREF)-1L) ) ? GetColor( COLOR_BTNTEXT ) : _ppbd.m_clrForceTextNormal ; } // if( _ppbd.m_bEnabled ) else { dc.SetTextColor( ( _ppbd.m_clrForceTextDisabled == ((COLORREF)-1L) ) ? GetColor( COLOR_3DFACE ) : _ppbd.m_clrForceTextDisabled ); } // else from if( _ppbd.m_bEnabled ) /* // center text CRect centerRect = rectCaption; */ CFont * pOldBtnFont = NULL; CFont * pCurrFont = NULL; CFont fontDummy; if( _ppbd.m_hFont != NULL ) { if( _ppbd.m_bHorz ) pCurrFont = CFont::FromHandle(_ppbd.m_hFont); else { LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); ::GetObject(_ppbd.m_hFont, sizeof(LOGFONT), &lf); if( lf.lfEscapement == 0 ) { lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT__; VERIFY( fontDummy.CreateFontIndirect(&lf) ); pCurrFont = &fontDummy; } else { // suppose font already prepared pCurrFont = CFont::FromHandle( _ppbd.m_hFont ); } } } // if( _ppbd.m_hFont != NULL ) else { if( _ppbd.m_bHorz ) { if( _ppbd.m_bDefaultPushButton ) pCurrFont = &m_FontBold; else pCurrFont = &m_FontNormal; } else { if( _ppbd.m_bDefaultPushButton ) pCurrFont = &m_FontBoldVert; else pCurrFont = &m_FontNormalVert; } } // else from if( _ppbd.m_hFont != NULL ) ASSERT( pCurrFont != NULL ); pOldBtnFont = dc.SelectObject( pCurrFont ); ASSERT( pOldBtnFont != NULL ); int nTextLength = sTitle.GetLength(); int nAmpIndex = sTitle.Find( _T('&') ); CExtSafeString sBtn; if( nAmpIndex < 0 ) sBtn = sTitle; else sBtn = sTitle.Left(nAmpIndex) + sTitle.Right( nTextLength - (nAmpIndex+1) ) ; ASSERT( sBtn.Find( _T('&') ) < 0 ); CRect rcText(0,0,0,0); dc.DrawText( sBtn, -1, rcText, DT_SINGLELINE|DT_CALCRECT ); CRect rcCenteredCaption( rectCaption ); rcCenteredCaption.OffsetRect( ( ( _ppbd.m_nDrawTextFlagsH & DT_CENTER ) != 0 ) ? ( ( rectCaption.Width() - rcText.Width() ) / 2 ) : 0 , ( ( _ppbd.m_nDrawTextFlagsH & DT_VCENTER ) != 0 ) ? ( ( rectCaption.Height() - rcText.Height() ) / 2 ) : 0 ); if( _ppbd.m_bHorz ) { if( _ppbd.m_bForceUseDrawTextApiH ) { dc.DrawText( sTitle, -1, rectCaption, _ppbd.m_nDrawTextFlagsH ); } // if( _ppbd.m_bForceUseDrawTextApiH ) else { dc.DrawState( rcCenteredCaption.TopLeft(), rcCenteredCaption.Size(), sTitle, ( _ppbd.m_bEnabled || ( _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) ) ) ? DSS_NORMAL : m_DSS_DISABLED_style , TRUE, 0, (CBrush*)NULL ); } // else from if( _ppbd.m_bForceUseDrawTextApiH ) } // if( _ppbd.m_bHorz ) else { LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); pCurrFont->GetLogFont(&lf); int _cyHorzFont = abs(lf.lfHeight); int _cyTextMargin = (rectCaption.Width() - _cyHorzFont) / 2 ; CPoint ptLineFrom(0,0), ptLineTo(0,0); if( nAmpIndex >= 0 ) { ptLineFrom = CPoint( __ExtMfc_CXTEXTMARGIN + _cyTextMargin, __ExtMfc_CYTEXTMARGIN + stat_CalcTextWidth( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn.Left(nAmpIndex) ) ); ptLineTo = CPoint( __ExtMfc_CXTEXTMARGIN + _cyTextMargin, __ExtMfc_CYTEXTMARGIN + stat_CalcTextWidth( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn.Left(nAmpIndex+1) ) ); int nXOffsPlus = rectCaption.Width() - stat_CalcTextDimension( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn ).Height(); nXOffsPlus /= 2; nXOffsPlus -= 4; ptLineFrom.x += nXOffsPlus; ptLineTo.x += nXOffsPlus; } // if( nAmpIndex >= 0 ) CRect rcString = CRect( CPoint( rectCaption.right - _cyTextMargin + __ExtMfc_CXTEXTMARGIN, rectCaption.top + __ExtMfc_CYTEXTMARGIN ), rectCaption.Size() //m_sizeHorz ); rcString.DeflateRect(2,2); CSize ptFix(-rcString.Width()-1,0); ptLineFrom += rcString.TopLeft() + ptFix; ptLineTo += rcString.TopLeft() + ptFix; if( _ppbd.m_bEnabled || ( _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) ) ) { dc.DrawText( sBtn, sBtn.GetLength(), rcString, DT_SINGLELINE|DT_NOCLIP|DT_NOPREFIX ); if( nAmpIndex >= 0 ) { CPen pen( PS_SOLID, 0, dc.GetTextColor() ); CPen * pOldPen = dc.SelectObject( &pen ); dc.MoveTo( ptLineFrom ); dc.LineTo( ptLineTo ); dc.SelectObject( pOldPen ); } // if( nAmpIndex >= 0 ) } // if( _ppbd.m_bEnabled || ( _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) ) ) else { CPoint ptOffsetPre(1,1); CPoint ptOffsetPost(-1,-1); COLORREF clrText = GetColor(COLOR_3DSHADOW); COLORREF clrShadow = GetColor(COLOR_3DHILIGHT); rcString.OffsetRect(ptOffsetPre.x,ptOffsetPre.y); dc.SetTextColor( clrShadow ); dc.DrawText( sBtn, sBtn.GetLength(), rcString, DT_SINGLELINE //|DT_CENTER|DT_VCENTER |DT_NOCLIP|DT_NOPREFIX ); // don't forget DT_NOCLIP rcString.OffsetRect(ptOffsetPost.x,ptOffsetPost.y); dc.SetTextColor( clrText ); dc.DrawText( sBtn, sBtn.GetLength(), rcString, DT_SINGLELINE //|DT_CENTER|DT_VCENTER |DT_NOCLIP|DT_NOPREFIX ); // don't forget DT_NOCLIP if( nAmpIndex >= 0 ) { CPen pen( PS_SOLID, 0, clrShadow ); CPen * pOldPen = dc.SelectObject( &pen ); ptLineFrom += ptOffsetPre; ptLineTo += ptOffsetPre; dc.MoveTo( ptLineFrom ); dc.LineTo( ptLineTo ); pen.DeleteObject(); pen.CreatePen( PS_SOLID, 0, clrText ); dc.SelectObject( &pen ); ptLineFrom += ptOffsetPost; ptLineTo += ptOffsetPost; dc.MoveTo( ptLineFrom ); dc.LineTo( ptLineTo ); dc.SelectObject( pOldPen ); } // if( nAmpIndex >= 0 ) } // else from if( _ppbd.m_bEnabled || ( _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) ) ) } // else from if( _ppbd.m_bHorz ) dc.SelectObject(pOldBtnFont); } // if( !sTitle.IsEmpty() ) if( _ppbd.m_bDrawFocusRect ) { CRect focusRect = rectCaption; // rectClient focusRect.DeflateRect( 3, 3 ); dc.DrawFocusRect(&focusRect); } // if( _ppbd.m_bDrawFocusRect ) } // if we have valid area for text & focus rect dc.SetBkMode( nOldBkMode ); dc.SetBkColor( clrOldBk ); dc.SetTextColor( clrOldText ); } CSize CExtPaintManager::GetDropDividerMerics() { ASSERT_VALID( this ); return CSize( 6, 6 ); } void CExtPaintManager::PaintDropDivider( CDC & dc, const RECT & rcItem, bool bBefore, bool bHorz ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); CRect rc( rcItem ); CSize _sizeDDM = GetDropDividerMerics(); COLORREF clr = GetColor( COLOR_BTNTEXT ); if( bHorz ) { rc.InflateRect( 0, 1 ); if( bBefore ) { rc.right = rc.left + 1; rc.left--; } // if( bBefore ) else { rc.left = rc.right - 1; rc.right++; } // else from if( bBefore ) dc.FillSolidRect( &rc, clr ); CRect rc2( rc ); rc2.bottom = rc2.top + 1; rc2.InflateRect( 2, 0 ); dc.FillSolidRect( &rc2, clr ); rc2.DeflateRect( 1, 0 ); rc2.bottom++; dc.FillSolidRect( &rc2, clr ); rc2 = rc; rc2.top = rc2.bottom - 1; rc2.InflateRect( 2, 0 ); dc.FillSolidRect( &rc2, clr ); rc2.DeflateRect( 1, 0 ); rc2.top--; dc.FillSolidRect( &rc2, clr ); } // if( bHorz ) else { rc.InflateRect( 1, 0 ); if( bBefore ) { rc.bottom = rc.top + 1; rc.top--; } // if( bBefore ) else { rc.top = rc.bottom - 1; rc.bottom++; rc.right--; } // else from if( bBefore ) dc.FillSolidRect( &rc, clr ); CRect rc2( rc ); rc2.right = rc2.left + 1; rc2.InflateRect( 0, 2 ); dc.FillSolidRect( &rc2, clr ); rc2.DeflateRect( 0, 1 ); rc2.right++; dc.FillSolidRect( &rc2, clr ); rc2 = rc; rc2.left = rc2.right - 1; rc2.InflateRect( 0, 2 ); dc.FillSolidRect( &rc2, clr ); rc2.DeflateRect( 0, 1 ); rc2.left--; dc.FillSolidRect( &rc2, clr ); } // else from if( bHorz ) } void CExtPaintManager::PaintDragSourceRect( CDC & dc, const RECT & rcItem ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); if( !dc.RectVisible(&rcItem) ) return; COLORREF clr = GetColor( COLOR_BTNTEXT ); CRect rc( rcItem ); dc.Draw3dRect( &rc, clr, clr ); rc.DeflateRect( 1, 1 ); dc.Draw3dRect( &rc, clr, clr ); } CRect CExtPaintManager::stat_CalcTextDimension( CDC & dc, CFont & font, const CExtSafeString & strText ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( font.GetSafeHandle() != NULL ); CRect rcText(0,0,0,0); CFont * pOldFont = dc.SelectObject( &font ); ASSERT( pOldFont != NULL ); dc.DrawText( strText, strText.GetLength(), &rcText, DT_SINGLELINE|DT_LEFT|DT_CALCRECT ); dc.SelectObject(pOldFont); rcText.OffsetRect( -rcText.TopLeft() ); return rcText; } int CExtPaintManager::stat_CalcTextWidth( CDC & dc, CFont & font, const CExtSafeString & strText ) { return CExtPaintManager::stat_CalcTextDimension( dc, font, strText ).Width(); } void CExtPaintManager::PaintMenuSeparator( CDC & dc, const RECT & rectItem, int nIconAreaWidth, bool bRarelyUsed, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; nIconAreaWidth; if( ::IsRectEmpty(&rectItem) ) return; CRect rectItem2(rectItem); if( bRarelyUsed ) { rectItem2.InflateRect(3,0,4,0); dc.FillRect( &rectItem2, &m_brushLightDefault ); rectItem2.DeflateRect(3,0,4,0); } else dc.FillSolidRect( &rectItem2, GetColor(CLR_3DFACE_OUT) ); int nFunnyDeflateMetric = ::GetSystemMetrics(SM_CXSMICON) / 2; rectItem2.DeflateRect( nFunnyDeflateMetric, 0 ); COLORREF clrBtnShadow = GetColor( bRarelyUsed ? CLR_3DFACE_OUT : CLR_3DSHADOW_OUT ); COLORREF clrBtnHilight = GetColor(CLR_3DHILIGHT_OUT); int y = (rectItem2.top+rectItem2.bottom)/2; rectItem2.top = y-1; rectItem2.bottom = y+1; dc.Draw3dRect( rectItem2, clrBtnShadow, clrBtnHilight ); } void CExtPaintManagerXP::PaintMenuSeparator( CDC & dc, const RECT & rectItem, int nIconAreaWidth, bool bRarelyUsed, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; nIconAreaWidth; if( ::IsRectEmpty(&rectItem) ) return; COLORREF clr3dFace = // GetColor(CLR_3DFACE_OUT); GetColor( bRarelyUsed ? XPCLR_RARELY_BORDER : CLR_3DFACE_OUT ); CRect rc( rectItem ), rcBottomFill( rectItem ); rcBottomFill.right = rcBottomFill.left + nIconAreaWidth; dc.FillSolidRect( rcBottomFill, clr3dFace ); COLORREF clrGradientLeft = ((COLORREF)(-1L)), clrGradientRight((COLORREF)(-1L)); bool b2StepGradient = false; if( bRarelyUsed ) { if( m_nIdxClrMlaRarelyLeft >= 0 && m_nIdxClrMlaRarelyRight >= 0 && stat_GetBPP() > 8 ) { // if paint gradient on rarely used item's left part clrGradientLeft = GetColor( m_nIdxClrMlaRarelyLeft ); clrGradientRight = GetColor( m_nIdxClrMlaRarelyRight ); } // if paint gradient on rarely used item's left part } // if( bRarelyUsed ) else { if( (!( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater )) ) b2StepGradient = true; if( m_nIdxClrMlaNormLeft >= 0 && m_nIdxClrMlaNormRight >= 0 && stat_GetBPP() > 8 ) { // if paint gradient on rarely used item's left part clrGradientLeft = GetColor( m_nIdxClrMlaNormLeft ); clrGradientRight = GetColor( m_nIdxClrMlaNormRight ); } // if paint gradient on rarely used item's left part } // else from if( bRarelyUsed ) if( clrGradientLeft != ((COLORREF)(-1L)) ) { ASSERT( clrGradientRight != ((COLORREF)(-1L)) ); CRect rcGradient( rectItem ); rcGradient.right = rcGradient.left + nIconAreaWidth; if( b2StepGradient ) { CRect rcGradient1( rcGradient ), rcGradient2( rcGradient ); rcGradient1.right = rcGradient1.left + ::MulDiv( rcGradient1.Width(), 7, 10 ); rcGradient2.left = rcGradient1.right; dc.FillSolidRect( &rcGradient2, clrGradientRight ); stat_PaintGradientRect( dc, &rcGradient1, clrGradientLeft, clrGradientRight, false ); } // if( b2StepGradient ) else stat_PaintGradientRect( dc, &rcGradient, clrGradientLeft, clrGradientRight, false ); } // if( clrGradientLeft != ((COLORREF)(-1L)) ) rc.left += nIconAreaWidth; dc.FillSolidRect( rc, GetColor(XPCLR_3DFACE_NORMAL) ); rc.left += __EXT_MENU_GAP; rc.top += rc.Height()/2; rc.bottom = rc.top+1; dc.FillSolidRect( rc, clr3dFace ); } void CExtPaintManager::PaintSysCmdGlyph( CDC & dc, UINT nHelperSysCmdID, const RECT & rcItem, bool bHover, bool bPushed, bool bEnabled ) { e_docking_caption_button_t eGlyph = __DCBT_EMPTY; switch( nHelperSysCmdID ) { case SC_CLOSE: eGlyph = __DCBT_CLOSE; break; case SC_RESTORE: eGlyph = __DCBT_WND_RESTORE; break; case SC_MINIMIZE: eGlyph = __DCBT_WND_MINIMIZE; break; case SC_MAXIMIZE: eGlyph = __DCBT_WND_MAXIMIZE; break; case SC_CONTEXTHELP: eGlyph = __DCBT_WND_CONTEXTHELP; break; } // switch( nHelperSysCmdID ) if( eGlyph == __DCBT_EMPTY ) return; COLORREF ColorValues[2] = { RGB(0,0,0), RGB(0,0,0), }; CRect _rcItem( rcItem ); if( bPushed ) _rcItem.OffsetRect( GetPushedOffset() ); if( bEnabled ) { ColorValues[1] = GetColor( bHover ? COLOR_HIGHLIGHTTEXT : CLR_TEXT_OUT ); } // if( bEnabled ) else { ColorValues[1] = GetColor( CLR_3DHILIGHT_OUT ); _rcItem.OffsetRect(1,1); PaintGlyphCentered( dc, _rcItem, *g_DockingCaptionGlyphs[eGlyph], ColorValues ); _rcItem.OffsetRect( -1, -1 ); ColorValues[1] = GetColor( CLR_3DSHADOW_OUT ); } // if( bEnabled ) PaintGlyphCentered( dc, _rcItem, *g_DockingCaptionGlyphs[eGlyph], ColorValues ); } void CExtPaintManagerXP::PaintSysCmdGlyph( CDC & dc, UINT nHelperSysCmdID, const RECT & rcItem, bool bHover, bool bPushed, bool bEnabled ) { e_docking_caption_button_t eGlyph = __DCBT_EMPTY; switch( nHelperSysCmdID ) { case SC_CLOSE: eGlyph = __DCBT_CLOSE; break; case SC_RESTORE: eGlyph = __DCBT_WND_RESTORE; break; case SC_MINIMIZE: eGlyph = __DCBT_WND_MINIMIZE; break; case SC_MAXIMIZE: eGlyph = __DCBT_WND_MAXIMIZE; break; case SC_CONTEXTHELP: eGlyph = __DCBT_WND_CONTEXTHELP; break; } // switch( nHelperSysCmdID ) if( eGlyph == __DCBT_EMPTY ) return; COLORREF ColorValues[2] = { RGB(0,0,0), RGB(0,0,0), }; CRect _rcItem( rcItem ); if( bPushed ) _rcItem.OffsetRect( GetPushedOffset() ); if( bEnabled ) { if( m_bEnabledHoverIconShadows && bHover && (!bPushed) ) { // COLOR_3DDKSHADOW changed to COLOR_3DSHADOW // by the Dmitry Yakovlev's advice ColorValues[1] = GetColor( COLOR_3DSHADOW // COLOR_3DDKSHADOW ); PaintGlyphCentered( dc, _rcItem, *g_DockingCaptionGlyphs[eGlyph], ColorValues ); // corrected by the Dmitry Yakovlev's advice _rcItem.OffsetRect( -2, -2 ); } // if( m_bEnabledHoverIconShadows && bHover && (!bPushed) ) ColorValues[1] = GetColor( CLR_TEXT_OUT ); } // if( bEnabled ) else ColorValues[1] = GetColor( COLOR_3DSHADOW ); PaintGlyphCentered( dc, _rcItem, *g_DockingCaptionGlyphs[eGlyph], ColorValues ); } CExtPaintManager::PAINTMENUITEMDATA::PAINTMENUITEMDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcItem( 0, 0, 0, 0 ) , m_nIconAreaWidth( 0 ) , m_sText( _T("") ) , m_sAccelText( _T("") ) , m_pIcon( NULL ) , m_bPopup( false ) , m_bSelected( false ) , m_bPushedCheck( false ) , m_bPushedRadio( false ) , m_bIndeterminate( false ) , m_bEnabled( false ) , m_bRarelyUsed( false ) , m_bRarelyUsedPrev( false ) , m_bRarelyUsedNext( false ) , m_nHelperSysCmdID( 0L ) , m_bForceNoLeftGradient( false ) , m_bCustomizeListMode( false ) , m_bSeparatedDropDown( false ) , m_rcInPlaceWnd( 0, 0, 0, 0 ) , m_strInPlaceText( _T("") ) , m_bXtraMark( false ) , m_bXtraChecked( false ) , m_bHelperPopupDropped( false ) { } CExtPaintManager::PAINTMENUITEMDATA::PAINTMENUITEMDATA( CObject * pHelperSrc, const RECT & rcItem, INT nIconAreaWidth, __EXT_MFC_SAFE_LPCTSTR sText, __EXT_MFC_SAFE_LPCTSTR sAccelText, CExtCmdIcon * pIcon, bool bPopup, bool bSelected, bool bPushedCheck, bool bPushedRadio, bool bIndeterminate, bool bEnabled, bool bRarelyUsed, bool bRarelyUsedPrev, bool bRarelyUsedNext, UINT nHelperSysCmdID // for painting system menu glyphs ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcItem( rcItem ) , m_nIconAreaWidth( nIconAreaWidth ) , m_sText( (sText == NULL) ? _T("") : sText ) , m_sAccelText( (sAccelText == NULL) ? _T("") : sAccelText ) , m_pIcon( pIcon ) , m_bPopup( bPopup ) , m_bSelected( bSelected ) , m_bPushedCheck( bPushedCheck ) , m_bPushedRadio( bPushedRadio ) , m_bIndeterminate( bIndeterminate ) , m_bEnabled( bEnabled ) , m_bRarelyUsed( bRarelyUsed ) , m_bRarelyUsedPrev( bRarelyUsedPrev ) , m_bRarelyUsedNext( bRarelyUsedNext ) , m_nHelperSysCmdID( nHelperSysCmdID ) , m_bForceNoLeftGradient( false ) , m_bCustomizeListMode( false ) , m_bSeparatedDropDown( false ) , m_rcInPlaceWnd( 0, 0, 0, 0 ) , m_strInPlaceText( _T("") ) , m_bXtraMark( false ) , m_bXtraChecked( false ) , m_bHelperPopupDropped( false ) { } void CExtPaintManager::PaintMenuItem( CDC & dc, CExtPaintManager::PAINTMENUITEMDATA & _pmid ) { if( _pmid.m_rcItem.IsRectEmpty() ) return; CExtSafeString _sText = (_pmid.m_sText==NULL) ? _T("") : _pmid.m_sText; CExtSafeString _sAccelText = (_pmid.m_sAccelText==NULL) ? _T("") : _pmid.m_sAccelText; COLORREF clr3dFace = GetColor( CLR_3DFACE_OUT ); COLORREF clrBk = clr3dFace; COLORREF clrText = GetColor(CLR_TEXT_OUT); CRect rcBk(_pmid.m_rcItem); dc.FillSolidRect(rcBk,clrBk); if( _pmid.m_bSelected ) { ASSERT( _pmid.m_bEnabled ); clrBk = GetColor(COLOR_HIGHLIGHT); clrText = GetColor(COLOR_HIGHLIGHTTEXT); } //else { if( _pmid.m_bRarelyUsed ) { rcBk.InflateRect(3,0,4,0); dc.FillRect(rcBk,&m_brushLightDefault); if( !_pmid.m_bRarelyUsedPrev ) { CPen penShadow( PS_SOLID, 1, GetColor(COLOR_3DSHADOW) ); CPen * pOldPen = dc.SelectObject( &penShadow ); ASSERT( pOldPen != NULL ); dc.MoveTo(rcBk.left,rcBk.top); dc.LineTo(rcBk.right,rcBk.top); dc.SelectObject( pOldPen ); } if( !_pmid.m_bRarelyUsedNext ) { CPen penLight( PS_SOLID, 1, GetColor(COLOR_3DHIGHLIGHT) ); CPen * pOldPen = dc.SelectObject( &penLight ); ASSERT( pOldPen != NULL ); dc.MoveTo(rcBk.left,rcBk.bottom-1); dc.LineTo(rcBk.right,rcBk.bottom-1); dc.SelectObject( pOldPen ); } rcBk.DeflateRect(3,0,4,0); } // if( _pmid.m_bRarelyUsed ) } bool bSmallerSelRect = ( (_pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty())) || _pmid.m_bPushedCheck || _pmid.m_bPushedRadio ) ? true : false; if( bSmallerSelRect ) rcBk.left += _pmid.m_nIconAreaWidth; if( _pmid.m_bSelected || (!_pmid.m_bRarelyUsed) ) dc.FillSolidRect(rcBk,clrBk); if( !bSmallerSelRect ) rcBk.left += _pmid.m_nIconAreaWidth; rcBk.DeflateRect(__EXT_MENU_GAP,__EXT_MENU_GAP); COLORREF clrOldText = dc.SetTextColor(clrText); int nOldBkMode = dc.SetBkMode(TRANSPARENT); rcBk.DeflateRect( __EXT_MENU_GAP, 0 ); CFont * pOldFont = dc.SelectObject(&m_FontNormal); ASSERT( pOldFont != NULL ); CRect rcMeasureText( 0, 0, 0, 0 ); dc.DrawText( _sText, _sText.GetLength(), &rcMeasureText, DT_CALCRECT|DT_SINGLELINE|DT_LEFT ); CRect rcDrawText( rcBk ); rcDrawText.OffsetRect( 0, ( rcDrawText.Height() - rcMeasureText.Height() ) / 2 ); dc.DrawState( rcDrawText.TopLeft(), rcDrawText.Size(), _sText, (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), TRUE, 0, (CBrush*)NULL ); if( !_sAccelText.IsEmpty() ) { rcMeasureText.SetRect( 0, 0, 0, 0 ); dc.DrawText( _sAccelText, _sAccelText.GetLength(), &rcMeasureText, DT_CALCRECT|DT_SINGLELINE|DT_LEFT ); rcDrawText = rcBk; rcDrawText.OffsetRect( 0, ( rcDrawText.Height() - rcMeasureText.Height() ) / 2 ); rcDrawText.left = rcDrawText.right - rcMeasureText.Width() - __EXT_MENU_POPUP_ARROW_AREA_DX ; rcBk.left = rcDrawText.left; dc.DrawState( rcDrawText.TopLeft(), rcDrawText.Size(), _sAccelText, (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), TRUE, 0, (CBrush*)NULL ); } // if( !_sAccelText.IsEmpty() ) if( _pmid.m_bPopup ) { CRect rcPopupArrow(_pmid.m_rcItem); rcPopupArrow.DeflateRect(__EXT_MENU_GAP,__EXT_MENU_GAP); rcPopupArrow.left = rcPopupArrow.right - __EXT_MENU_POPUP_ARROW_AREA_DX; if( _pmid.m_bCustomizeListMode ) { COLORREF ColorValues[2] = { RGB(0,0,0), GetColor( _pmid.m_bSelected ? COLOR_HIGHLIGHTTEXT : CLR_TEXT_OUT ) }; PaintGlyphCentered( dc, rcPopupArrow, _pmid.m_bSeparatedDropDown ? g_glyph_customize_dropdown_src : g_glyph_customize_popup_src, ColorValues ); } // if( _pmid.m_bCustomizeListMode ) else { dc.SelectObject(&m_FontMarlett); dc.DrawText( _T("8"), // popup rightArrow rcPopupArrow, DT_CENTER|DT_VCENTER|DT_SINGLELINE ); } // else from if( _pmid.m_bCustomizeListMode ) } // if( _pmid.m_bPopup ) dc.SelectObject(&pOldFont); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); CSize sizeIcon( __EXT_MENU_ICON_CX, __EXT_MENU_ICON_CY ); if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) { sizeIcon = _pmid.m_pIcon->GetSize(); if( sizeIcon.cx <= 18 && sizeIcon.cy < sizeIcon.cx ) sizeIcon.cy = sizeIcon.cx; } CRect rcIcon( _pmid.m_rcItem.TopLeft(), sizeIcon ); if( _pmid.m_bXtraMark ) { rcIcon.OffsetRect( ( _pmid.m_nIconAreaWidth/2 - rcIcon.Width() ) / 2 + _pmid.m_nIconAreaWidth/2 - 2, ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2 ); if( _pmid.m_bXtraChecked ) { CRect rcXtraMark( _pmid.m_rcItem.left+1, _pmid.m_rcItem.top+1, _pmid.m_rcItem.left+_pmid.m_rcItem.Height()-2, _pmid.m_rcItem.bottom-2 ); dc.FillRect( rcXtraMark, &m_brushLightDefault ); COLORREF clrCheck = GetColor(CLR_TEXT_OUT); int x = rcXtraMark.left + rcXtraMark.Width()/2 - 3; int y = rcXtraMark.top + rcXtraMark.Height()/2 - 3; ASSERT( !_pmid.m_bPushedRadio ); stat_PaintCheckMark( dc, x,y, clrCheck ); dc.Draw3dRect( rcXtraMark, GetColor(CLR_3DSHADOW_OUT), GetColor(CLR_3DHILIGHT_OUT) ); } // if( _pmid.m_bXtraChecked ) } // if( _pmid.m_bXtraMark ) else { rcIcon.OffsetRect( ( _pmid.m_nIconAreaWidth - rcIcon.Width() ) / 2, ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2 ); } // else from if( _pmid.m_bXtraMark ) CRect rcIconFrame(rcIcon); rcIconFrame.InflateRect(__EXT_MENU_IMG_RECT_OUT_GAP,__EXT_MENU_IMG_RECT_OUT_GAP); if( _pmid.m_bPushedCheck || _pmid.m_bPushedRadio ) dc.FillRect( rcIconFrame, &m_brushLightDefault ); if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) { // dc.DrawState( // rcIcon.TopLeft(), // rcIcon.Size(), // _pmid.m_pIcon->GetIcon(), // (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), // (CBrush*)NULL // ); _pmid.m_pIcon->Paint( dc, rcIcon.TopLeft(), _pmid.m_bEnabled ? CExtCmdIcon::__DRAW_NORMAL : CExtCmdIcon::__DRAW_DISABLED ); if( _pmid.m_bSelected && _pmid.m_bEnabled && (!(_pmid.m_bPushedCheck || _pmid.m_bPushedRadio)) ) dc.Draw3dRect( &rcIconFrame, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); } // if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) else { PaintSysCmdGlyph( dc, _pmid.m_nHelperSysCmdID, rcIcon, _pmid.m_bSelected, false, _pmid.m_bEnabled ); } // else from if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) if( _pmid.m_bPushedCheck || _pmid.m_bPushedRadio ) { if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() ) { COLORREF clrCheck = GetColor(CLR_TEXT_OUT); int x = rcIcon.left + rcIcon.Width()/2 - 3; int y = rcIcon.top + rcIcon.Height()/2 - 3; if( _pmid.m_bPushedCheck ) { ASSERT( !_pmid.m_bPushedRadio ); stat_PaintCheckMark( dc, x,y, clrCheck ); } else { ASSERT( !_pmid.m_bPushedCheck ); stat_PaintRadioDot( dc, x,y, clrCheck ); } } // if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() ) dc.Draw3dRect( rcIconFrame, GetColor(CLR_3DSHADOW_OUT), GetColor(CLR_3DHILIGHT_OUT) ); } if( !_pmid.m_rcInPlaceWnd.IsRectEmpty() ) { CRect rcInPlaceWndOuterBorder( _pmid.m_rcInPlaceWnd ); rcInPlaceWndOuterBorder.InflateRect( 2, 2, 2, 3 ); if( _pmid.m_bPopup ) { INT nDD = (INT) ::GetSystemMetrics(SM_CXHTHUMB); rcInPlaceWndOuterBorder.right += nDD; // rcInPlaceWndOuterBorder.InflateRect( 1, 1 ); PAINTCOMBOFRAMEDATA _pcfd( _pmid.m_pHelperSrc, rcInPlaceWndOuterBorder, _pmid.m_bSelected, // hover _pmid.m_bSelected && _pmid.m_bHelperPopupDropped, // pushed _pmid.m_bEnabled ); _pcfd.m_bNoTopOuterBorder = true; PaintComboFrame( dc, _pcfd ); rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); rcInPlaceWndOuterBorder.right -= nDD; } // if( _pmid.m_bPopup ) else { // dc.Draw3dRect( // rcInPlaceWndOuterBorder, // GetColor(COLOR_3DSHADOW), // GetColor(COLOR_3DHIGHLIGHT) // ); // rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); // dc.Draw3dRect( // rcInPlaceWndOuterBorder, // GetColor(COLOR_3DDKSHADOW), // GetColor(COLOR_3DFACE) // ); COLORREF clrFace = GetColor( COLOR_3DFACE ); dc.Draw3dRect( rcInPlaceWndOuterBorder, clrFace, clrFace ); rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); if( _pmid.m_bSelected ) dc.Draw3dRect( rcInPlaceWndOuterBorder, GetColor(COLOR_3DSHADOW), GetColor(COLOR_3DHIGHLIGHT) ); else dc.Draw3dRect( rcInPlaceWndOuterBorder, clrFace, clrFace ); } // else from if( _pmid.m_bPopup ) rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); dc.FillSolidRect( &rcInPlaceWndOuterBorder, GetColor( _pmid.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) ); if( !_pmid.m_strInPlaceText.IsEmpty() ) { rcInPlaceWndOuterBorder.DeflateRect( 5, 2, 1, 2 ); COLORREF clrOldText = dc.SetTextColor( GetColor( COLOR_BTNTEXT ) ); int nOldBkMode = dc.SetBkMode(TRANSPARENT); CFont * pOldFont = dc.SelectObject(&m_FontNormal); ASSERT( pOldFont != NULL ); dc.DrawText( _pmid.m_strInPlaceText, _pmid.m_strInPlaceText.GetLength(), &rcInPlaceWndOuterBorder, DT_SINGLELINE|DT_NOPREFIX|DT_LEFT|DT_TOP ); dc.SelectObject(&pOldFont); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); } // if( !_pmid.m_strInPlaceText.IsEmpty() ) } // if( !_pmid.m_rcInPlaceWnd.IsRectEmpty() ) } void CExtPaintManagerXP::PaintMenuItem( CDC & dc, CExtPaintManager::PAINTMENUITEMDATA & _pmid ) { if( _pmid.m_rcItem.IsRectEmpty() ) return; CExtSafeString _sText = (_pmid.m_sText==NULL) ? _T("") : _pmid.m_sText; CExtSafeString _sAccelText = (_pmid.m_sAccelText==NULL) ? _T("") : _pmid.m_sAccelText; COLORREF clr3dFace = // GetColor( CLR_3DFACE_OUT ); GetColor( _pmid.m_bRarelyUsed ? XPCLR_RARELY_BORDER : CLR_3DFACE_OUT ); COLORREF clrDkBorder = GetColor( XPCLR_HILIGHT_BORDER ); COLORREF clrBk = clr3dFace; COLORREF clrText = GetColor(CLR_TEXT_OUT); COLORREF clrBkHilight = GetColor(XPCLR_HILIGHT); COLORREF clrIconBkHilight = _pmid.m_bSelected ? clrBkHilight : GetColor( CLR_3DFACE_IN ); COLORREF clrRight = GetColor(XPCLR_3DFACE_NORMAL); CRect rcBk( _pmid.m_rcItem ), rcSelBk( _pmid.m_rcItem ); { // BLOCK: paint left area COLORREF clrGradientLeft = ((COLORREF)(-1L)), clrGradientRight((COLORREF)(-1L)); bool b2StepGradient = false; if( stat_GetBPP() > 8 ) { if( _pmid.m_bRarelyUsed ) { if( m_nIdxClrMlaRarelyLeft >= 0 && m_nIdxClrMlaRarelyRight >= 0 ) { // if paint gradient on rarely used item's left part clrGradientLeft = GetColor( m_nIdxClrMlaRarelyLeft ); clrGradientRight = GetColor( m_nIdxClrMlaRarelyRight ); } // if paint gradient on rarely used item's left part } // if( _pmid.m_bRarelyUsed ) else { if( (!( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater )) ) b2StepGradient = true; if( m_nIdxClrMlaNormLeft >= 0 && m_nIdxClrMlaNormRight >= 0 ) { // if paint gradient on rarely used item's left part clrGradientLeft = GetColor( m_nIdxClrMlaNormLeft ); clrGradientRight = GetColor( m_nIdxClrMlaNormRight ); } // if paint gradient on rarely used item's left part } // else from if( _pmid.m_bRarelyUsed ) } // if( stat_GetBPP() > 8 ) CRect rcGradient( rcBk ); rcGradient.right = rcGradient.left + _pmid.m_nIconAreaWidth; if( (!_pmid.m_bForceNoLeftGradient) && clrGradientLeft != ((COLORREF)(-1L)) ) { ASSERT( clrGradientRight != ((COLORREF)(-1L)) ); if( b2StepGradient ) { CRect rcGradient1( rcGradient ), rcGradient2( rcGradient ); rcGradient1.right = rcGradient1.left + ::MulDiv( rcGradient1.Width(), 7, 10 ); rcGradient2.left = rcGradient1.right; dc.FillSolidRect( &rcGradient2, clrGradientRight ); stat_PaintGradientRect( dc, &rcGradient1, clrGradientLeft, clrGradientRight, false ); } // if( b2StepGradient ) else stat_PaintGradientRect( dc, &rcGradient, clrGradientLeft, clrGradientRight, false ); } // if( (!_pmid.m_bForceNoLeftGradient) && clrGradientLeft != ((COLORREF)(-1L)) ) else dc.FillSolidRect( &rcGradient, clrBk ); CRect rcFillRightPart( rcBk ); if( (!_pmid.m_bForceNoLeftGradient) ) rcFillRightPart.left += _pmid.m_nIconAreaWidth; dc.FillSolidRect( &rcFillRightPart, clrRight ); } // BLOCK: paint left area if( _pmid.m_bSelected ) { ASSERT( _pmid.m_bEnabled ); rcSelBk.bottom -= __EXT_MENU_VERT_DISTANCE_NORM; clrBk = GetColor( CLR_3DFACE_IN ); dc.FillSolidRect( &rcSelBk, clrBk ); dc.Draw3dRect( &rcSelBk, clrDkBorder, clrDkBorder ); } // if( _pmid.m_bSelected ) if( (!_pmid.m_bForceNoLeftGradient) ) rcBk.left += _pmid.m_nIconAreaWidth; rcBk.DeflateRect( __EXT_MENU_GAP, __EXT_MENU_IMG_RECT_OUT_GAP-1 ); COLORREF clrOldText = dc.SetTextColor(clrText); int nOldBkMode = dc.SetBkMode(TRANSPARENT); CFont * pOldFont = dc.SelectObject(&m_FontNormal); ASSERT( pOldFont != NULL ); CRect rcMeasureText( 0, 0, 0, 0 ); dc.DrawText( _sText, _sText.GetLength(), &rcMeasureText, DT_CALCRECT|DT_SINGLELINE|DT_LEFT ); CRect rcDrawText( rcBk ); rcDrawText.OffsetRect( 0, ( rcDrawText.Height() - rcMeasureText.Height() ) / 2 ); dc.DrawState( rcDrawText.TopLeft(), rcDrawText.Size(), _sText, (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), TRUE, 0, _pmid.m_bEnabled ? (CBrush*)NULL : CBrush::FromHandle( GetBrush(COLOR_3DSHADOW) ) ); if( !_sAccelText.IsEmpty() ) { rcMeasureText.SetRect( 0, 0, 0, 0 ); dc.DrawText( _sAccelText, _sAccelText.GetLength(), &rcMeasureText, DT_CALCRECT|DT_SINGLELINE|DT_LEFT ); rcDrawText = rcBk; rcDrawText.OffsetRect( 0, ( rcDrawText.Height() - rcMeasureText.Height() ) / 2 ); rcDrawText.left = rcDrawText.right - rcMeasureText.Width() - __EXT_MENU_POPUP_ARROW_AREA_DX ; rcBk.left = rcDrawText.left; dc.DrawState( rcDrawText.TopLeft(), rcDrawText.Size(), _sAccelText, (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), TRUE, 0, _pmid.m_bEnabled ? (CBrush*)NULL : CBrush::FromHandle( GetBrush(COLOR_3DSHADOW) ) ); } // if( !_sAccelText.IsEmpty() ) if( _pmid.m_bPopup ) { CRect rcPopupArrow(_pmid.m_rcItem); rcPopupArrow.DeflateRect(__EXT_MENU_GAP,__EXT_MENU_GAP); rcPopupArrow.left = rcPopupArrow.right - __EXT_MENU_POPUP_ARROW_AREA_DX; if( _pmid.m_bCustomizeListMode ) { COLORREF ColorValues[2] = { RGB(0,0,0), GetColor(CLR_TEXT_OUT) }; PaintGlyphCentered( dc, rcPopupArrow, _pmid.m_bSeparatedDropDown ? g_glyph_customize_dropdown_src : g_glyph_customize_popup_src, ColorValues ); } // if( _pmid.m_bCustomizeListMode ) else { dc.SelectObject(&m_FontMarlett); dc.DrawText( _T("8"), // popup rightArrow rcPopupArrow, DT_CENTER|DT_VCENTER|DT_SINGLELINE ); } // else from if( _pmid.m_bCustomizeListMode ) } // if( _pmid.m_bPopup ) dc.SelectObject(&pOldFont); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); CSize sizeIcon( __EXT_MENU_ICON_CX, __EXT_MENU_ICON_CY ); if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) { sizeIcon = _pmid.m_pIcon->GetSize(); if( sizeIcon.cx <= 18 && sizeIcon.cy < sizeIcon.cx ) sizeIcon.cy = sizeIcon.cx; } CRect rcIcon( _pmid.m_rcItem.TopLeft(), sizeIcon ); if( _pmid.m_bXtraMark ) { rcIcon.OffsetRect( ( _pmid.m_nIconAreaWidth/2 - rcIcon.Width() ) / 2 + _pmid.m_nIconAreaWidth/2 - 2, ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2 ); if( _pmid.m_bXtraChecked ) { CRect rcXtraMark( _pmid.m_rcItem.left+1, _pmid.m_rcItem.top+1, _pmid.m_rcItem.left+_pmid.m_rcItem.Height()-2, _pmid.m_rcItem.bottom-2 ); int nIdxMainGradientLeft = -1; int nIdxMainGradientRight = -1; if( _pmid.m_bSelected ) { nIdxMainGradientLeft = m_nIdxClrBtnHovPresLeft; nIdxMainGradientRight = m_nIdxClrBtnHovPresRight; } // if( _pmid.m_bSelected ) else { nIdxMainGradientLeft = m_nIdxClrBtnPressedLeft; nIdxMainGradientRight = m_nIdxClrBtnPressedRight; } // else if( _pmid.m_bSelected ) if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) { stat_PaintGradientRect( dc, rcXtraMark, GetColor( nIdxMainGradientRight ), GetColor( nIdxMainGradientLeft ), true ); } // if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) else { dc.FillSolidRect( rcXtraMark, clrIconBkHilight ); } // else from if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) COLORREF clrCheck = GetColor(CLR_TEXT_OUT); int x = rcXtraMark.left + rcXtraMark.Width()/2 - 3; int y = rcXtraMark.top + rcXtraMark.Height()/2 - 3; ASSERT( !_pmid.m_bPushedRadio ); stat_PaintCheckMark( dc, x,y, clrCheck ); dc.Draw3dRect( rcXtraMark, clrDkBorder, clrDkBorder ); } // if( _pmid.m_bXtraChecked ) } // if( _pmid.m_bXtraMark ) else { rcIcon.OffsetRect( ( _pmid.m_nIconAreaWidth - rcIcon.Width() ) / 2, ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2 ); } // else from if( _pmid.m_bXtraMark ) CRect rcIconFrame( rcIcon ); rcIconFrame.InflateRect(__EXT_MENU_IMG_RECT_OUT_GAP,__EXT_MENU_IMG_RECT_OUT_GAP); if( _pmid.m_bPushedCheck || _pmid.m_bPushedRadio ) { int nIdxMainGradientLeft = -1; int nIdxMainGradientRight = -1; if( _pmid.m_bSelected ) { nIdxMainGradientLeft = m_nIdxClrBtnHovPresLeft; nIdxMainGradientRight = m_nIdxClrBtnHovPresRight; } // if( _pmid.m_bSelected ) else { nIdxMainGradientLeft = m_nIdxClrBtnPressedLeft; nIdxMainGradientRight = m_nIdxClrBtnPressedRight; } // else if( _pmid.m_bSelected ) if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) { stat_PaintGradientRect( dc, rcIconFrame, GetColor( nIdxMainGradientRight ), GetColor( nIdxMainGradientLeft ), true ); } // if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) else { dc.FillSolidRect( rcIconFrame, clrIconBkHilight ); } // else from if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) } if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) { CRect rcDummy; CExtSafeString sTitle( _T("") ); PaintIcon( dc, true, sTitle, _pmid.m_pIcon, rcIcon, rcDummy, _pmid.m_bPushedCheck || _pmid.m_bPushedRadio, _pmid.m_bEnabled, _pmid.m_bSelected, 0 ); } // if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) else { PaintSysCmdGlyph( dc, _pmid.m_nHelperSysCmdID, rcIcon, _pmid.m_bSelected, false, _pmid.m_bEnabled ); } // else from if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) ) if( _pmid.m_bPushedCheck || _pmid.m_bPushedRadio ) { if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() ) { COLORREF clrCheck = GetColor(CLR_TEXT_OUT); int x = rcIcon.left + rcIcon.Width()/2 - 3; int y = rcIcon.top + rcIcon.Height()/2 - 3; if( _pmid.m_bPushedCheck ) { ASSERT( !_pmid.m_bPushedRadio ); stat_PaintCheckMark( dc, x,y, clrCheck ); } else { ASSERT( !_pmid.m_bPushedCheck ); stat_PaintRadioDot( dc, x,y, clrCheck ); } } // if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() ) dc.Draw3dRect( rcIconFrame, clrDkBorder, clrDkBorder ); } if( !_pmid.m_rcInPlaceWnd.IsRectEmpty() ) { CRect rcInPlaceWndOuterBorder( _pmid.m_rcInPlaceWnd ); rcInPlaceWndOuterBorder.InflateRect( 1, 2 ); if( _pmid.m_bPopup ) { INT nDD = (INT) ::GetSystemMetrics(SM_CXHTHUMB); rcInPlaceWndOuterBorder.right += nDD; rcInPlaceWndOuterBorder.InflateRect( 1, 1 ); PAINTCOMBOFRAMEDATA _pcfd( _pmid.m_pHelperSrc, rcInPlaceWndOuterBorder, _pmid.m_bSelected, // hover _pmid.m_bSelected && _pmid.m_bHelperPopupDropped, // pushed _pmid.m_bEnabled ); _pcfd.m_bNoTopOuterBorder = true; PaintComboFrame( dc, _pcfd ); rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); if( _pmid.m_bSelected ) { dc.Draw3dRect( &rcInPlaceWndOuterBorder, clrDkBorder, clrDkBorder ); } // if( _pmid.m_bSelected ) else { COLORREF clrBorder = GetColor( CLR_3DFACE_OUT ); dc.Draw3dRect( &rcInPlaceWndOuterBorder, clrBorder, clrBorder ); COLORREF clrWindow = GetColor( COLOR_WINDOW ); CRect rcBtn( rcInPlaceWndOuterBorder ); rcBtn.left = rcBtn.right - nDD; rcBtn.DeflateRect( 0, 1, 1, 1 ); dc.Draw3dRect( &rcBtn, clrWindow, clrWindow ); } // else from if( _pmid.m_bSelected ) rcInPlaceWndOuterBorder.right -= nDD; } // if( _pmid.m_bPopup ) else { COLORREF clr = _pmid.m_bSelected ? clrDkBorder : GetColor(COLOR_3DLIGHT) ; dc.Draw3dRect( &rcInPlaceWndOuterBorder, clr, clr ); } // else from if( _pmid.m_bPopup ) rcInPlaceWndOuterBorder.DeflateRect( 1, 1 ); dc.FillSolidRect( &rcInPlaceWndOuterBorder, GetColor( _pmid.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) ); if( !_pmid.m_strInPlaceText.IsEmpty() ) { rcInPlaceWndOuterBorder.DeflateRect( 5, 3, 1, 2 ); COLORREF clrOldText = dc.SetTextColor( GetColor( COLOR_BTNTEXT ) ); int nOldBkMode = dc.SetBkMode(TRANSPARENT); CFont * pOldFont = dc.SelectObject(&m_FontNormal); ASSERT( pOldFont != NULL ); dc.DrawText( _pmid.m_strInPlaceText, _pmid.m_strInPlaceText.GetLength(), &rcInPlaceWndOuterBorder, DT_SINGLELINE|DT_NOPREFIX|DT_LEFT|DT_TOP ); dc.SelectObject(&pOldFont); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); } // if( !_pmid.m_strInPlaceText.IsEmpty() ) } // if( !_pmid.m_rcInPlaceWnd.IsRectEmpty() ) } void CExtPaintManager::PaintIcon( CDC & dc, bool bHorz, CExtSafeString & sTitle, CExtCmdIcon * pIcon, const CRect & rectItem, CRect & rectCaption, bool bPushed, bool bEnabled, bool bHover, int eAlign ) { bHover; rectCaption = rectItem; if( pIcon == NULL || pIcon->IsEmpty() ) return; CSize _sizeIcon = pIcon->GetSize(); ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 ); CRect iconRect = rectItem; CRect btnRect; if( bHorz ) { if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) { if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); else { iconRect.left += 3; rectCaption.left += _sizeIcon.cx + 3; } } // if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) else { if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) { btnRect = rectCaption; if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); else { rectCaption.right = rectCaption.Width() - _sizeIcon.cx - 3; rectCaption.left = 3; iconRect.left = btnRect.right - _sizeIcon.cx - 3; // Center the icon vertically iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); } } // if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) } // else from if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) if( (eAlign&__ALIGN_VERT) != 0 ) { // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); } // if( (eAlign&__ALIGN_VERT) != 0 ) } // if( bHorz ) else { if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) { if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); else { iconRect.top += 3; rectCaption.top += _sizeIcon.cy + 3; } } // if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) else { if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) { btnRect = rectCaption; if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); else { rectCaption.top = rectCaption.Height() - _sizeIcon.cy - 3; rectCaption.top = 3; iconRect.top = btnRect.top - _sizeIcon.cy - 3; // Center the icon vertically iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); } } // if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) } // else from if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) if( (eAlign&__ALIGN_VERT) != 0 ) { // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); } // if( (eAlign&__ALIGN_VERT) != 0 ) } // else from if( bHorz ) // If button is pressed then press the icon also if( bPushed ) { CSize sizePushedOffset = GetPushedOffset(); iconRect.OffsetRect(sizePushedOffset.cx, sizePushedOffset.cy); } // dc.DrawState( // iconRect.TopLeft(), // iconRect.Size(), // pIcon->GetIcon(), // (bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), // (CBrush*)NULL // ); pIcon->Paint( dc, iconRect.TopLeft(), bEnabled ? CExtCmdIcon::__DRAW_NORMAL : CExtCmdIcon::__DRAW_DISABLED ); } void CExtPaintManagerOffice2003::PaintSeparator( CDC & dc, const RECT & rectItem, bool bHorz, bool bTransparentBk, CObject * pHelperSrc, LPARAM lParam // = 0L ) { if( pHelperSrc == NULL || (!( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtToolControlBar)) || pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtBarButton)) || pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) )) || stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintSeparator( dc, rectItem, bHorz, bTransparentBk, pHelperSrc, lParam ); return; } CRect rectItem2(rectItem); if( !bTransparentBk ) dc.FillSolidRect( rectItem2, GetColor(CLR_3DFACE_OUT) ); COLORREF clrBtnShadow = GetColor(_2003CLR_SEPARATOR_DARK); COLORREF clrBtnHilight = GetColor(_2003CLR_SEPARATOR_LIGHT); if( bHorz ) { int x = (rectItem2.left + rectItem2.right) / 2; rectItem2.left = x-1; rectItem2.right = x+1; if( pHelperSrc == NULL || (! pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) ) ) rectItem2.DeflateRect( 0, 3, 0, 4 ); dc.Draw3dRect( rectItem2, clrBtnShadow, clrBtnHilight ); } // if( bHorz ) else { int y = (rectItem2.top+rectItem2.bottom)/2; rectItem2.top = y-1; rectItem2.bottom = y+1; if( pHelperSrc == NULL || (! pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) ) ) rectItem2.DeflateRect( 4, 0, 5, 0 ); dc.Draw3dRect( rectItem2, clrBtnShadow, clrBtnHilight ); } // else from if( bHorz ) } void CExtPaintManagerXP::PaintSeparator( CDC & dc, const RECT & rectItem, bool bHorz, bool bTransparentBk, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; CRect rectItem2(rectItem); if( !bTransparentBk ) dc.FillSolidRect( rectItem2, GetColor(CLR_3DFACE_OUT) ); if( bHorz ) { rectItem2.left = rectItem2.left + rectItem2.Width()/2 - 1; rectItem2.right = rectItem2.left + 1; rectItem2.DeflateRect( 0, 1 ); } else { rectItem2.top = rectItem2.top + rectItem2.Height()/2 - 1; rectItem2.bottom = rectItem2.top + 1; rectItem2.DeflateRect( 1, 0 ); } dc.FillSolidRect( &rectItem2, GetColor(XPCLR_SEPARATOR) ); } void CExtPaintManager::PaintSeparator( CDC & dc, const RECT & rectItem, bool bHorz, bool bTransparentBk, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; CRect rectItem2(rectItem); if( !bTransparentBk ) dc.FillSolidRect( rectItem2, GetColor(CLR_3DFACE_OUT) ); COLORREF clrBtnShadow = GetColor(CLR_3DSHADOW_OUT); COLORREF clrBtnHilight = GetColor(CLR_3DHILIGHT_OUT); if( bHorz ) { int x = (rectItem2.left + rectItem2.right) / 2; rectItem2.left = x-1; rectItem2.right = x+1; rectItem2.DeflateRect( 0, 0, 0, 1 ); dc.Draw3dRect( rectItem2, clrBtnShadow, clrBtnHilight ); } // if( bHorz ) else { int y = (rectItem2.top+rectItem2.bottom)/2; rectItem2.top = y-1; rectItem2.bottom = y+1; rectItem2.DeflateRect( 0, 0, 1, 0 ); dc.Draw3dRect( rectItem2, clrBtnShadow, clrBtnHilight ); } // else from if( bHorz ) } CExtPaintManager::PAINTCONTROLFRAMEDATA::PAINTCONTROLFRAMEDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcClient( 0,0,0,0 ) , m_bFlat( false ) , m_bHover( false ) , m_bEnabled( false ) , m_bFocus( false ) { } CExtPaintManager::PAINTCONTROLFRAMEDATA::PAINTCONTROLFRAMEDATA( CObject * pHelperSrc, const RECT & rcClient, bool bFlat, bool bHover, bool bEnabled, bool bFocus ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcClient( rcClient ) , m_bFlat( bFlat ) , m_bHover( bHover ) , m_bEnabled( bEnabled ) , m_bFocus( bFocus ) { } void CExtPaintManager::PaintControlFrame( CDC & dc, CExtPaintManager::PAINTCONTROLFRAMEDATA & _pcfd ) { CRect rectItem( _pcfd.m_rcClient ); COLORREF clrInner = GetColor( COLOR_WINDOW ); COLORREF clrIn1, clrIn2, clrOut1, clrOut2; clrIn1 = clrIn2 = clrOut1 = clrOut2 = GetColor( CLR_3DFACE_OUT ); if( _pcfd.m_bEnabled ) { if( _pcfd.m_bHover && _pcfd.m_bFocus ) { clrIn1 = GetColor( COLOR_3DFACE ); clrIn2 = GetColor( COLOR_3DDKSHADOW ); clrOut1 = GetColor( COLOR_3DHILIGHT ); clrOut2 = GetColor( COLOR_3DSHADOW ); } // if( _pcfd.m_bHover && _pcfd.m_bFocus ) else { if( _pcfd.m_bHover || _pcfd.m_bFocus ) { clrIn1 = GetColor( COLOR_3DHILIGHT ); clrIn2 = GetColor( COLOR_3DSHADOW ); } // if( _pcfd.m_bHover || _pcfd.m_bFocus ) } // elsefrom if( _pcfd.m_bHover && _pcfd.m_bFocus ) } // else from if( _pcfd.m_bEnabled ) dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrIn2, clrIn1 ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrOut2, clrOut1 ); } void CExtPaintManagerXP::PaintControlFrame( CDC & dc, CExtPaintManager::PAINTCONTROLFRAMEDATA & _pcfd ) { CRect rectItem( _pcfd.m_rcClient ); COLORREF clrInner = GetColor( COLOR_WINDOW ); COLORREF clrIn, clrOut; clrIn = clrOut = GetColor( CLR_3DFACE_OUT ); if( _pcfd.m_bEnabled ) { if( _pcfd.m_bHover ) { if( _pcfd.m_bFocus ) clrIn = clrOut = GetColor( XPCLR_HILIGHT_BORDER ); else clrIn = GetColor( XPCLR_HILIGHT_BORDER ); } // if( _pcfd.m_bHover ) else { if( _pcfd.m_bFocus ) clrIn = GetColor( XPCLR_HILIGHT_BORDER ); } // else from if( _pcfd.m_bHover ) } // else from if( _pcfd.m_bEnabled ) dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrInner, clrInner ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrIn, clrIn ); rectItem.InflateRect(1,1); dc.Draw3dRect( rectItem, clrOut, clrOut ); } CExtPaintManager::PAINTCOMBOFRAMEDATA::PAINTCOMBOFRAMEDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcClient( 0,0,0,0 ) , m_bHover( false ) , m_bPushed( false ) , m_bEnabled( false ) , m_clrForceNABorder( COLORREF(-1L) ) , m_clrForceNAContent( COLORREF(-1L) ) , m_clrForceActiveOuterBorder( COLORREF(-1L) ) , m_bNoTopOuterBorder( false ) { } CExtPaintManager::PAINTCOMBOFRAMEDATA::PAINTCOMBOFRAMEDATA( CObject * pHelperSrc, const RECT & rcClient, bool bHover, bool bPushed, bool bEnabled ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcClient( rcClient ) , m_bHover( bHover ) , m_bPushed( bPushed ) , m_bEnabled( bEnabled ) , m_clrForceNABorder( COLORREF(-1L) ) , m_clrForceNAContent( COLORREF(-1L) ) , m_clrForceActiveOuterBorder( COLORREF(-1L) ) , m_bNoTopOuterBorder( false ) { } void CExtPaintManager::PaintComboFrame( CDC &dc, CExtPaintManager::PAINTCOMBOFRAMEDATA & _pcfd ) { COLORREF clrTopLeft, clrBottomRight; if( _pcfd.m_clrForceNAContent == COLORREF(-1L) ) clrTopLeft = clrBottomRight = GetColor( CLR_3DFACE_OUT ); else clrTopLeft = clrBottomRight = _pcfd.m_clrForceNAContent; if( _pcfd.m_bPushed || _pcfd.m_bHover ) { clrTopLeft = GetColor( CLR_3DSHADOW_IN ); clrBottomRight = GetColor( CLR_3DHILIGHT_IN ); } COLORREF clrHilightOut = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bPushed || _pcfd.m_bHover ) ? GetColor( CLR_3DHILIGHT_OUT ) : _pcfd.m_clrForceNABorder ; COLORREF clrFaceOut = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bPushed || _pcfd.m_bHover ) ? GetColor( CLR_3DFACE_OUT ) : _pcfd.m_clrForceNABorder ; COLORREF clrWindow = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bPushed || _pcfd.m_bHover ) ? GetColor( _pcfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) : _pcfd.m_clrForceNABorder ; CRect rectClient( _pcfd.m_rcClient ); dc.Draw3dRect( rectClient, clrTopLeft, clrBottomRight ); rectClient.DeflateRect(1,1); dc.Draw3dRect( rectClient, _pcfd.m_bEnabled ? clrFaceOut : clrHilightOut, _pcfd.m_bEnabled ? clrFaceOut : clrHilightOut ); rectClient.left = rectClient.right - ::GetSystemMetrics(SM_CXHTHUMB); dc.Draw3dRect( rectClient, clrFaceOut, clrFaceOut ); rectClient.DeflateRect(1,1); dc.Draw3dRect( rectClient, clrHilightOut, clrHilightOut ); dc.FillSolidRect( rectClient.left-2, rectClient.top, 3, rectClient.Height(), _pcfd.m_bEnabled ? clrWindow : clrFaceOut ); if( _pcfd.m_bHover || _pcfd.m_bPushed ) dc.FillSolidRect( rectClient, clrFaceOut ); rectClient.left++; CFont font; int ppi = dc.GetDeviceCaps(LOGPIXELSX); int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi font.CreatePointFont(pointsize, _T("Marlett")); PAINTPUSHBUTTONDATA _ppbd( this, true, rectClient, _T("6"), NULL, true, (_pcfd.m_bHover&&(!_pcfd.m_bPushed)) ? true : false, //(bHover||bPushed) ? true : false, _pcfd.m_bPushed ? true : false, false, _pcfd.m_bEnabled, true, false, false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, (HFONT)font.GetSafeHandle() // = NULL ); PaintPushButton( dc, _ppbd ); if( !(_pcfd.m_bHover || _pcfd.m_bPushed) ) { if( !_pcfd.m_bHover ) dc.Draw3dRect( rectClient, clrHilightOut, clrHilightOut ); else dc.Draw3dRect( rectClient, clrFaceOut, clrFaceOut ); } } void CExtPaintManager::stat_PaintDotNet3dRect( CDC & dc, LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight ) { stat_PaintDotNet3dRect( dc, lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight ); } void CExtPaintManager::stat_PaintDotNet3dRect( CDC & dc, int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight ) { const int nPixelGap = 1; dc.FillSolidRect( x + nPixelGap, y, cx - 1 - nPixelGap, 1, clrTopLeft ); dc.FillSolidRect( x, y + nPixelGap, 1, cy - 1 - nPixelGap, clrTopLeft ); dc.FillSolidRect( x + cx, y + nPixelGap, -1, cy - nPixelGap*2, clrBottomRight ); dc.FillSolidRect( x + nPixelGap, y + cy, cx - nPixelGap*2, -1, clrBottomRight ); } void CExtPaintManager::stat_PaintRadioDot( CDC & dc, int x, int y, COLORREF color ) { CBrush brush,*pOldBrush; CPen pen,*pOldPen; CRect rcDot(x,y,x+6,y+6); COLORREF color2 = dc.GetNearestColor( RGB( 255-GetRValue(color), 255-GetGValue(color), 255-GetBValue(color) ) ); rcDot.OffsetRect(1,1); brush.CreateSolidBrush(color2); pen.CreatePen(PS_SOLID,0,color2); pOldBrush=dc.SelectObject(&brush); pOldPen=dc.SelectObject(&pen); dc.Ellipse(&rcDot); pen.DeleteObject(); brush.DeleteObject(); rcDot.OffsetRect(-1,-1); brush.CreateSolidBrush(color); pen.CreatePen(PS_SOLID,0,color); dc.SelectObject(&brush); dc.SelectObject(&pen); dc.Ellipse(&rcDot); dc.SelectObject(pOldBrush); dc.SelectObject(pOldPen); pen.DeleteObject(); brush.DeleteObject(); } void CExtPaintManager::stat_PaintCheckMark( CDC & dc, int x, int y, COLORREF color ) { COLORREF color2 = dc.GetNearestColor( RGB( 255-GetRValue(color), 255-GetGValue(color), 255-GetBValue(color) ) ); dc.SetPixel(x,y+2,color); dc.SetPixel(x,y+3,color); dc.SetPixel(x,y+4,color2); dc.SetPixel(x+1,y+3,color); dc.SetPixel(x+1,y+4,color); dc.SetPixel(x+1,y+5,color2); dc.SetPixel(x+2,y+4,color); dc.SetPixel(x+2,y+5,color); dc.SetPixel(x+2,y+6,color2); dc.SetPixel(x+3,y+3,color); dc.SetPixel(x+3,y+4,color); dc.SetPixel(x+3,y+5,color2); dc.SetPixel(x+4,y+2,color); dc.SetPixel(x+4,y+3,color); dc.SetPixel(x+4,y+4,color2); dc.SetPixel(x+5,y+1,color); dc.SetPixel(x+5,y+2,color); dc.SetPixel(x+5,y+3,color2); dc.SetPixel(x+6,y,color); dc.SetPixel(x+6,y+1,color); dc.SetPixel(x+6,y+2,color2); } void CExtPaintManager::stat_PaintTabItemImpl( CDC & dc, CRect & rcTabItemsArea, bool bTopLeft, bool bHorz, bool bSelected, bool bCenteredText, bool bGroupedMode, bool bInGroupActive, bool bInvertedVerticalMode, const CRect & rcEntireItem, CSize sizeTextMeasured, CFont * pFont, __EXT_MFC_SAFE_LPCTSTR sText, CExtCmdIcon * pIcon, COLORREF clrText, COLORREF clrTabBk, COLORREF clrTabBorderLT, COLORREF clrTabBorderRB, COLORREF clrTabSeparator ) { #if (!defined __EXT_MFC_NO_TAB_CTRL) ASSERT( dc.GetSafeHdc() != NULL ); rcTabItemsArea; sizeTextMeasured; bInGroupActive; CRect rcItem( rcEntireItem ); if( bGroupedMode ) { CRect rcTabMargin( rcItem ); rcTabMargin.InflateRect( 0, 0, bHorz ? 1 : 0, bHorz ? 0 : 1 ); rcTabMargin.InflateRect( bHorz ? 0 : 2, bHorz ? 2 : 0 ); dc.FillSolidRect( &rcTabMargin, clrTabBk ); dc.Draw3dRect( rcTabMargin, clrTabBorderLT, clrTabBorderRB ); } // if( bGroupedMode ) else { if( bSelected ) { CRect rcTabSel( rcItem ); rcTabSel.InflateRect( bHorz ? __EXTTAB_SEPARATOR_DX : 0, bHorz ? 0 : __EXTTAB_SEPARATOR_DY, 0, 0 ); CRect rcSetMargins( ( (!bHorz) && (!bTopLeft) ) ? 1 : 0, ( bHorz && (!bTopLeft) ) ? 1 : 0, ( (!bHorz) && bTopLeft ) ? 1 : 0, ( bHorz && bTopLeft ) ? 1 : 0 ); rcTabSel.InflateRect( rcSetMargins.left, rcSetMargins.top, rcSetMargins.right, rcSetMargins.bottom ); dc.Draw3dRect( rcTabSel, clrTabBorderLT, clrTabBorderRB ); if( bHorz ) dc.SetPixel( rcTabSel.left, bTopLeft ? (rcTabSel.bottom - 1) : rcTabSel.top, clrTabBk ); else dc.SetPixel( bTopLeft ? (rcTabSel.right - 1) : rcTabSel.left, rcTabSel.top, clrTabBk ); rcTabSel.DeflateRect( (rcSetMargins.left == 0) ? 1 : 0, (rcSetMargins.top == 0) ? 1 : 0, (rcSetMargins.right == 0) ? 1 : 0, (rcSetMargins.bottom == 0) ? 1 : 0 ); dc.FillSolidRect( &rcTabSel, clrTabBk ); } // if( bSelected ) else { CRect rcSeparator( rcItem ); if( bHorz ) { rcSeparator.left = rcSeparator.right - 1; rcSeparator.DeflateRect( 0, __EXTTAB_SEPARATOR_GAP_HORZ ); } else { rcSeparator.top = rcSeparator.bottom - 1; rcSeparator.DeflateRect( __EXTTAB_SEPARATOR_GAP_VERT, 0 ); } dc.FillSolidRect( &rcSeparator, clrTabSeparator ); } // else from if( bSelected ) } // else from if( bGroupedMode ) rcItem.DeflateRect( bHorz ? __EXTTAB_MARGIN_BORDER_HX : __EXTTAB_MARGIN_BORDER_VX, bHorz ? __EXTTAB_MARGIN_BORDER_HY : __EXTTAB_MARGIN_BORDER_VY ); CSize _sizeIcon( 0, 0 ); if( pIcon != NULL && (!pIcon->IsEmpty()) ) { _sizeIcon = pIcon->GetSize(); ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 ); } // if( pIcon != NULL && (!pIcon->IsEmpty()) ) CRect rcItemForIcon( rcItem ); if( pIcon != NULL && (! pIcon->IsEmpty()) && _sizeIcon.cx > 0 && _sizeIcon.cy > 0 ) { // rcItemForIcon.DeflateRect( // bHorz ? 0 : ( rcItem.Width() - _sizeIcon.cx), // bHorz ? ( rcItem.Height() - _sizeIcon.cy) : 0 // ); rcItemForIcon.right = rcItemForIcon.left + _sizeIcon.cx; rcItemForIcon.bottom = rcItemForIcon.top + _sizeIcon.cy; rcItemForIcon.OffsetRect( bHorz ? 0 : ((rcItem.Width() - _sizeIcon.cx) / 2), bHorz ? ((rcItem.Height() - _sizeIcon.cy) / 2) : 0 ); if( rcItemForIcon.left < (rcItem.left+1) ) rcItemForIcon.left = (rcItem.left+1); if( rcItemForIcon.right < (rcItem.right-1) ) rcItemForIcon.right = (rcItem.right-1); if( rcItemForIcon.top < (rcItem.top+1) ) rcItemForIcon.top = (rcItem.top+1); if( rcItemForIcon.bottom < (rcItem.bottom-1) ) rcItemForIcon.bottom = (rcItem.bottom-1); } CExtSafeString sItemText( (sText == NULL) ? _T("") : sText ); // IMPORTANT: the rcText calculation fixed by Genka CRect rcText( rcItem.left // rcItemForIcon.left + ( bHorz ? (_sizeIcon.cx + ((_sizeIcon.cx > 0) ? __EXTTAB_MARGIN_ICON2TEXT_X : 0) ) : 0 ), rcItem.top // rcItemForIcon.left + ( bHorz ? 0 : (_sizeIcon.cy + ((_sizeIcon.cy > 0) ? __EXTTAB_MARGIN_ICON2TEXT_Y : 0) ) ), rcItem.right, rcItem.bottom ); if( !bHorz ) { int nWidth0 = rcText.Width(); int nWidth1 = rcItem.Width() + __EXTTAB_MARGIN_ICON2TEXT_X*2; if( nWidth1 > nWidth0 ) { if( bInvertedVerticalMode ) { rcText.right -= __EXTTAB_MARGIN_ICON2TEXT_X; rcText.left = rcText.right - nWidth1; } // if( bInvertedVerticalMode ) else { rcText.left += __EXTTAB_MARGIN_ICON2TEXT_X; rcText.right = rcText.left + nWidth1; } // else from if( bInvertedVerticalMode ) } // if( nWidth1 > nWidth0 ) } // if( !bHorz ) //dc.FillSolidRect( &rcText, RGB(0,0,255) ); CSize _sizeText = rcText.Size(); bool bDrawText = false; if( ( bHorz && _sizeText.cx >= ( max(16,_sizeIcon.cx) ) ) || ( (!bHorz) && _sizeText.cy >= ( max(16,_sizeIcon.cy) ) ) ) bDrawText = true; if( !bDrawText && !( bGroupedMode && ! bInGroupActive ) ) { rcItemForIcon.OffsetRect( bHorz ? (rcItem.Width() - _sizeIcon.cx)/2 : 0, bHorz ? 0 : (rcItem.Height() - _sizeIcon.cy)/2 ); } if( pIcon != NULL && (! pIcon->IsEmpty()) ) { if( (bHorz && rcItemForIcon.Width() >= _sizeIcon.cx ) || (!bHorz && rcItemForIcon.Height() >= _sizeIcon.cy) ) { CRect rcTmpText( 0, 0, 0, 0 ); rcItemForIcon.OffsetRect( -1, -1 ); g_PaintManager->PaintIcon( dc, true, sItemText, pIcon, rcItemForIcon, rcTmpText, false, true, false, 0 ); } } // if( pIcon != NULL && (! pIcon->IsEmpty()) ) if( bDrawText ) { // if we have sense to paint text on tab item ASSERT( pFont != NULL ); ASSERT( pFont->GetSafeHandle() != NULL ); COLORREF clrOldText = dc.SetTextColor( clrText ); INT nOldBkMode = dc.SetBkMode( TRANSPARENT ); CFont * pOldFont = dc.SelectObject( pFont ); if( !bHorz ) { if( bCenteredText ) { UINT nOldTA = dc.SetTextAlign( TA_CENTER | TA_BASELINE ); rcText.OffsetRect( bInvertedVerticalMode ? sizeTextMeasured.cy/2 : - sizeTextMeasured.cy/2 , 0 ); CPoint ptCenter = rcText.CenterPoint(); dc.ExtTextOut( ptCenter.x, ptCenter.y, ETO_CLIPPED, &rcText, sItemText, sItemText.GetLength(), NULL ); dc.SetTextAlign( nOldTA ); } // if( bCenteredText ) else { UINT nOldTA = dc.SetTextAlign( TA_TOP | TA_BASELINE ); rcText.OffsetRect( bInvertedVerticalMode ? sizeTextMeasured.cy/2 : - sizeTextMeasured.cy/2 , 0 ); CPoint ptCenter = rcText.CenterPoint(); if( bInvertedVerticalMode ) ptCenter.y = rcText.bottom - 4 - (rcText.Height() - sizeTextMeasured.cx) ; else ptCenter.y = rcText.top + 4 ; dc.ExtTextOut( ptCenter.x, ptCenter.y, ETO_CLIPPED, &rcText, sItemText, sItemText.GetLength(), NULL ); dc.SetTextAlign( nOldTA ); } // else from if( bCenteredText ) } // if( !bHorz ) else { UINT nFormat = DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS; if( bCenteredText ) nFormat |= DT_CENTER; else nFormat |= DT_LEFT; //rcText.InflateRect( 0, 3 ); dc.DrawText( sItemText, sItemText.GetLength(), rcText, nFormat ); } dc.SelectObject( pOldFont ); dc.SetBkMode( nOldBkMode ); dc.SetTextColor( clrOldText ); } // if we have sense to paint text on tab item #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcTabItemsArea; bTopLeft; bHorz; bSelected; bCenteredText; bGroupedMode; bInGroupActive; bInvertedVerticalMode; rcEntireItem; sizeTextMeasured; pFont; sText; pIcon; clrText; clrTabBk; clrTabBorderLT; clrTabBorderRB; clrTabSeparator; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManager::stat_PaintTabClientAreaImpl( CDC & dc, CRect & rcClient, CRect & rcTabItemsArea, CRect & rcTabNearBorderArea, DWORD dwOrientation, bool bGroupedMode, COLORREF clrTabItemsAreaBk, COLORREF clrTabNearBorderAreaBk, COLORREF clrTabNearMargin ) { #if (!defined __EXT_MFC_NO_TAB_CTRL) ASSERT( dc.GetSafeHdc() != NULL ); rcTabItemsArea; CRect rcTabNearMargin( rcTabNearBorderArea ); // prepare tab border margin rect switch( dwOrientation ) { case __ETWS_ORIENT_TOP: rcTabNearMargin.bottom = rcTabNearMargin.top + 1; break; case __ETWS_ORIENT_BOTTOM: rcTabNearMargin.top = rcTabNearMargin.bottom - 1; break; case __ETWS_ORIENT_LEFT: rcTabNearMargin.right = rcTabNearMargin.left + 1; break; case __ETWS_ORIENT_RIGHT: rcTabNearMargin.left = rcTabNearMargin.right - 1; break; #ifdef _DEBUG default: ASSERT( FALSE ); break; #endif // _DEBUG } // switch( dwOrientation ) // fill all area with tab items background color dc.FillSolidRect( &rcClient, clrTabItemsAreaBk ); if( !bGroupedMode ) { // fill tab border area dc.FillSolidRect( &rcTabNearBorderArea, clrTabNearBorderAreaBk ); // paint tab border margin dc.FillSolidRect( &rcTabNearMargin, clrTabNearMargin ); } // if( !bGroupedMode ) #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcClient; rcTabItemsArea; rcTabNearBorderArea; dwOrientation; bGroupedMode; clrTabItemsAreaBk; clrTabNearBorderAreaBk; clrTabNearMargin; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManager::stat_PaintTabButtonImpl( CDC & dc, CRect & rcButton, LONG nHitTest, bool bTopLeft, bool bHorz, bool bEnabled, bool bHover, bool bPushed, bool bGroupedMode, COLORREF clrGlyph, COLORREF clrTL, COLORREF clrBR ) { #if (!defined __EXT_MFC_NO_TAB_CTRL) bTopLeft; bGroupedMode; CExtPaintManager::glyph_t * pGlyph = NULL; switch( nHitTest ) { case __ETWH_BUTTON_LEFTUP: pGlyph = CExtPaintManager::g_DockingCaptionGlyphs[ bHorz ? ( bEnabled ? CExtPaintManager::__DCBT_ARROW_LEFT : CExtPaintManager::__DCBT_HOLLOW_LEFT ) : ( bEnabled ? CExtPaintManager::__DCBT_ARROW_UP : CExtPaintManager::__DCBT_HOLLOW_UP ) ]; ASSERT( pGlyph != NULL ); break; case __ETWH_BUTTON_RIGHTDOWN: pGlyph = CExtPaintManager::g_DockingCaptionGlyphs[ bHorz ? ( bEnabled ? CExtPaintManager::__DCBT_ARROW_RIGHT : CExtPaintManager::__DCBT_HOLLOW_RIGHT ) : ( bEnabled ? CExtPaintManager::__DCBT_ARROW_DOWN : CExtPaintManager::__DCBT_HOLLOW_DOWN ) ]; ASSERT( pGlyph != NULL ); break; case __ETWH_BUTTON_HELP: pGlyph = CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_WND_CONTEXTHELP ]; ASSERT( pGlyph != NULL ); break; case __ETWH_BUTTON_CLOSE: pGlyph = CExtPaintManager::g_DockingCaptionGlyphs[ CExtPaintManager::__DCBT_CLOSE ]; ASSERT( pGlyph != NULL ); break; #ifdef _DEBUG default: ASSERT( FALSE ); break; #endif // _DEBUG } // switch( nHitTest ) ASSERT( pGlyph != NULL ); //dc.FillSolidRect( &rcButton, RGB( 255, 128, 128 ) ); COLORREF ColorValues[2] = { RGB(0,0,0), clrGlyph }; g_PaintManager->PaintGlyphCentered( dc, rcButton, *pGlyph, ColorValues ); if( bHover || bPushed ) dc.Draw3dRect( &rcButton, clrTL, clrBR ); #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcButton; nHitTest; bTopLeft; bHorz; bEnabled; bHover; bPushed; bGroupedMode; clrGlyph; clrTL; clrBR; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManager::PaintTabItem( CDC & dc, CRect & rcTabItemsArea, bool bTopLeft, bool bHorz, bool bSelected, bool bCenteredText, bool bGroupedMode, bool bInGroupActive, bool bInvertedVerticalMode, const CRect & rcEntireItem, CSize sizeTextMeasured, CFont * pFont, __EXT_MFC_SAFE_LPCTSTR sText, CExtCmdIcon * pIcon, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrText = GetColor( (bSelected && !bGroupedMode) ? COLOR_BTNTEXT : ( bGroupedMode ? COLOR_BTNTEXT : COLOR_3DHILIGHT) ); COLORREF clrTabBk = GetColor( COLOR_BTNFACE ); COLORREF clrTabBorderLT = GetColor( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DHILIGHT ); COLORREF clrTabBorderRB = GetColor( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DDKSHADOW ); COLORREF clrTabSeparator = GetColor( ( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DLIGHT) ); CExtPaintManager::stat_PaintTabItemImpl( dc, rcTabItemsArea, bTopLeft, bHorz, bSelected, bCenteredText, bGroupedMode, bInGroupActive, bInvertedVerticalMode, rcEntireItem, sizeTextMeasured, pFont, sText, pIcon, clrText, clrTabBk, clrTabBorderLT, clrTabBorderRB, clrTabSeparator ); } void CExtPaintManagerXP::PaintTabItem( CDC & dc, CRect & rcTabItemsArea, bool bTopLeft, bool bHorz, bool bSelected, bool bCenteredText, bool bGroupedMode, bool bInGroupActive, bool bInvertedVerticalMode, const CRect & rcEntireItem, CSize sizeTextMeasured, CFont * pFont, __EXT_MFC_SAFE_LPCTSTR sText, CExtCmdIcon * pIcon, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrText = GetColor( (bSelected || bGroupedMode) ? COLOR_BTNTEXT : COLOR_3DSHADOW ); COLORREF clrTabBk = GetColor( bGroupedMode ? COLOR_3DFACE : XPCLR_3DFACE_DARK ); COLORREF clrTabBorderLT = GetColor( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DHILIGHT ); COLORREF clrTabBorderRB = GetColor( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DDKSHADOW ); COLORREF clrTabSeparator = GetColor( COLOR_3DSHADOW ); CExtPaintManager::stat_PaintTabItemImpl( dc, rcTabItemsArea, bTopLeft, bHorz, bSelected, bCenteredText, bGroupedMode, bInGroupActive, bInvertedVerticalMode, rcEntireItem, sizeTextMeasured, pFont, sText, pIcon, clrText, clrTabBk, clrTabBorderLT, clrTabBorderRB, clrTabSeparator ); } void CExtPaintManager::PaintTabClientArea( CDC & dc, CRect & rcClient, CRect & rcTabItemsArea, CRect & rcTabNearBorderArea, DWORD dwOrientation, bool bGroupedMode, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; #if (!defined __EXT_MFC_NO_TAB_CTRL) int idxClrTabNearMargin = COLOR_3DDKSHADOW; switch( dwOrientation ) { case __ETWS_ORIENT_TOP: idxClrTabNearMargin = COLOR_3DHILIGHT; break; case __ETWS_ORIENT_BOTTOM: break; case __ETWS_ORIENT_LEFT: idxClrTabNearMargin = COLOR_3DHILIGHT; break; case __ETWS_ORIENT_RIGHT: break; #ifdef _DEBUG default: ASSERT( FALSE ); break; #endif // _DEBUG } // switch( dwOrientation ) COLORREF clrTabItemsAreaBk = GetColor( bGroupedMode ? COLOR_3DFACE : COLOR_3DSHADOW ); COLORREF clrTabNearBorderAreaBk = GetColor( COLOR_3DFACE ); COLORREF clrTabNearMargin = GetColor( idxClrTabNearMargin ); CExtPaintManager::stat_PaintTabClientAreaImpl( dc, rcClient, rcTabItemsArea, rcTabNearBorderArea, dwOrientation, bGroupedMode, clrTabItemsAreaBk, clrTabNearBorderAreaBk, clrTabNearMargin ); #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcClient; rcTabItemsArea; rcTabNearBorderArea; dwOrientation; bGroupedMode; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManagerXP::PaintTabClientArea( CDC & dc, CRect & rcClient, CRect & rcTabItemsArea, CRect & rcTabNearBorderArea, DWORD dwOrientation, bool bGroupedMode, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; #if (!defined __EXT_MFC_NO_TAB_CTRL) int idxClrTabNearMargin = COLOR_3DSHADOW; switch( dwOrientation ) { case __ETWS_ORIENT_TOP: idxClrTabNearMargin = COLOR_3DHILIGHT; break; case __ETWS_ORIENT_BOTTOM: break; case __ETWS_ORIENT_LEFT: idxClrTabNearMargin = COLOR_3DHILIGHT; break; case __ETWS_ORIENT_RIGHT: break; #ifdef _DEBUG default: ASSERT( FALSE ); break; #endif // _DEBUG } // switch( dwOrientation ) COLORREF clrTabItemsAreaBk = GetColor( XPCLR_3DFACE_NORMAL ); COLORREF clrTabNearBorderAreaBk = GetColor( XPCLR_3DFACE_DARK ); COLORREF clrTabNearMargin = GetColor( idxClrTabNearMargin ); CExtPaintManager::stat_PaintTabClientAreaImpl( dc, rcClient, rcTabItemsArea, rcTabNearBorderArea, dwOrientation, bGroupedMode, clrTabItemsAreaBk, clrTabNearBorderAreaBk, clrTabNearMargin ); #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcClient; rcTabItemsArea; rcTabNearBorderArea; dwOrientation; bGroupedMode; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManagerOffice2003::PaintTabClientArea( CDC & dc, CRect & rcClient, CRect & rcTabItemsArea, CRect & rcTabNearBorderArea, DWORD dwOrientation, bool bGroupedMode, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; #if (!defined __EXT_MFC_NO_TAB_CTRL) bool bFrameBackground = false; if( pHelperSrc != NULL && pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtTabWnd)) && m_bmpDockerGradient.GetSafeHandle() != NULL && stat_GetBPP() > 8 ) { if( #if (!defined __EXT_MFC_NO_TABMDI_CTRL) pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtTabMdiWnd)) || #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL) ((CExtTabWnd*)pHelperSrc)->m_bReflectParentSizing ) bFrameBackground = true; #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS) else if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynTabWnd)) || pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynAutoHideArea)) ) bFrameBackground = true; #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS) } if( bFrameBackground ) { CRect rcTabNearMargin( rcTabNearBorderArea ); // prepare tab border margin rect switch( dwOrientation ) { case __ETWS_ORIENT_TOP: rcTabNearMargin.bottom = rcTabNearMargin.top + 1; break; case __ETWS_ORIENT_BOTTOM: rcTabNearMargin.top = rcTabNearMargin.bottom - 1; break; case __ETWS_ORIENT_LEFT: rcTabNearMargin.right = rcTabNearMargin.left + 1; break; case __ETWS_ORIENT_RIGHT: rcTabNearMargin.left = rcTabNearMargin.right - 1; break; #ifdef _DEBUG default: ASSERT( FALSE ); break; #endif // _DEBUG } // switch( dwOrientation ) CWnd * pFrame = ((CExtTabWnd*)pHelperSrc)->GetParentFrame(); if( pFrame == NULL ) pFrame = ((CExtTabWnd*)pHelperSrc)->GetParent(); ASSERT_VALID( pFrame ); CRect rcPaintGradient; pFrame->GetClientRect( &rcPaintGradient ); pFrame->ClientToScreen( &rcPaintGradient ); ((CExtTabWnd*)pHelperSrc)->ScreenToClient( &rcPaintGradient ); CDC & dcCompat = CachedDcGet( m_bmpDockerGradient ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return; } int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, m_sizeDockerGradient.cx, m_sizeDockerGradient.cy, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); if( !bGroupedMode ) { COLORREF clrTabNearMargin = GetColor( COLOR_3DSHADOW ); COLORREF clrTabNearBorderAreaBk = GetColor( CLR_3DFACE_OUT ); // fill tab border area dc.FillSolidRect( &rcTabNearBorderArea, clrTabNearBorderAreaBk ); // paint tab border margin dc.FillSolidRect( &rcTabNearMargin, clrTabNearMargin ); } // if( !bGroupedMode ) return; } // if( bFrameBackground ) CExtPaintManagerXP::PaintTabClientArea( dc, rcClient, rcTabItemsArea, rcTabNearBorderArea, dwOrientation, bGroupedMode, pHelperSrc, lParam ); #else // (!defined __EXT_MFC_NO_TAB_CTRL) dc; rcClient; rcTabItemsArea; rcTabNearBorderArea; dwOrientation; bGroupedMode; #endif // else from(!defined __EXT_MFC_NO_TAB_CTRL) } void CExtPaintManager::PaintTabButton( CDC & dc, CRect & rcButton, LONG nHitTest, bool bTopLeft, bool bHorz, bool bEnabled, bool bHover, bool bPushed, bool bGroupedMode, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrGlyph = g_PaintManager->GetColor( bGroupedMode ? ( bEnabled ? COLOR_BTNTEXT : COLOR_3DSHADOW ) : ( bEnabled ? COLOR_3DHIGHLIGHT : COLOR_3DFACE ) ); COLORREF clrTL = g_PaintManager->GetColor( bPushed ? COLOR_3DDKSHADOW : COLOR_3DHILIGHT ); COLORREF clrBR = g_PaintManager->GetColor( bPushed ? COLOR_3DHILIGHT : COLOR_3DDKSHADOW ); CExtPaintManager::stat_PaintTabButtonImpl( dc, rcButton, nHitTest, bTopLeft, bHorz, bEnabled, bHover, bPushed, bGroupedMode, clrGlyph, clrTL, clrBR ); } void CExtPaintManagerXP::PaintTabButton( CDC & dc, CRect & rcButton, LONG nHitTest, bool bTopLeft, bool bHorz, bool bEnabled, bool bHover, bool bPushed, bool bGroupedMode, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrGlyph = g_PaintManager->GetColor( bEnabled ? COLOR_BTNTEXT : COLOR_3DSHADOW ); COLORREF clrTL = g_PaintManager->GetColor( bPushed ? COLOR_3DDKSHADOW : COLOR_3DHILIGHT ); COLORREF clrBR = g_PaintManager->GetColor( bPushed ? COLOR_3DHILIGHT : COLOR_3DDKSHADOW ); CExtPaintManager::stat_PaintTabButtonImpl( dc, rcButton, nHitTest, bTopLeft, bHorz, bEnabled, bHover, bPushed, bGroupedMode, clrGlyph, clrTL, clrBR ); } void CExtPaintManager::PaintTabNcAreaRect( CDC & dc, const RECT & rc, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrTL = GetColor( COLOR_3DSHADOW ); COLORREF clrBR = GetColor( COLOR_3DHILIGHT ); dc.Draw3dRect( &rc, clrTL, clrBR ); } void CExtPaintManagerXP::PaintTabNcAreaRect( CDC & dc, const RECT & rc, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; COLORREF clrTL = GetColor( COLOR_3DSHADOW ); COLORREF clrBR = clrTL; dc.Draw3dRect( &rc, clrTL, clrBR ); } void CExtPaintManager::PaintDockBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( ::IsRectEmpty( &rcClient ) || ( ! dc.RectVisible( &rcClient ) ) ) return; dc.FillSolidRect( &rcClient, GetColor( COLOR_3DFACE ) ); } void CExtPaintManagerXP::PaintDockBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManager::PaintDockBarClientArea( dc, rcClient, pHelperSrc, lParam ); } bool CExtPaintManager::GetCb2DbTransparentMode( CObject * pObjHelperSrc, LPARAM lParam // = 0L ) { pObjHelperSrc; lParam; return false; } bool CExtPaintManagerXP::GetCb2DbTransparentMode( CObject * pObjHelperSrc, LPARAM lParam // = 0L ) { pObjHelperSrc; lParam; return false; } bool CExtPaintManagerOffice2003::GetCb2DbTransparentMode( CObject * pObjHelperSrc, LPARAM lParam // = 0L ) { pObjHelperSrc; lParam; if( stat_GetBPP() <= 8 ) return false; return true; } bool CExtPaintManager::PaintDockerBkgnd( CDC & dc, CWnd * pWnd, LPARAM lParam // = NULL ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow(pWnd->GetSafeHwnd()) ); dc; pWnd; lParam; return false; } bool CExtPaintManagerXP::PaintDockerBkgnd( CDC & dc, CWnd * pWnd, LPARAM lParam // = NULL ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow(pWnd->GetSafeHwnd()) ); dc; pWnd; lParam; return false; } bool CExtPaintManagerOffice2003::PaintDockerBkgnd( CDC & dc, CWnd * pWnd, LPARAM lParam // = NULL ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow(pWnd->GetSafeHwnd()) ); lParam; if( (! GetCb2DbTransparentMode(pWnd) ) || m_bmpDockerGradient.GetSafeHandle() == NULL ) return false; COLORREF clrSolidShade0 = ((COLORREF)(-1L)); COLORREF clrSolidShade1 = ((COLORREF)(-1L)); bool bToolbarShade = false; bool bToolbarHorz = false; for( CWnd * pFrame = pWnd; pFrame != NULL; pFrame = pFrame->GetParent() ) { if( (pFrame->GetStyle() & WS_CHILD) == 0 ) { if(! pFrame->IsKindOf(RUNTIME_CLASS(CFrameWnd)) ) return false; break; } if( pFrame != pWnd && pFrame->IsKindOf( RUNTIME_CLASS(CExtToolControlBar) ) ) { if( ((CExtToolControlBar*)pFrame)->m_pDockSite != NULL ) { if( !( pFrame->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) || pFrame->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) ) ) { if( ((CExtToolControlBar*)pFrame)->IsFloating() ) { clrSolidShade0 = GetColor( _2003CLR_MLA_NORM_RIGHT ); clrSolidShade1 = GetColor( _2003CLR_SEPARATOR_LIGHT ); } else { bToolbarShade = true; bToolbarHorz = ((CExtToolControlBar*)pFrame)->IsDockedHorizontally(); } } } break; } } if( pFrame == NULL ) return false; CRect rcPaintGradient; pFrame->GetClientRect( &rcPaintGradient ); pFrame->ClientToScreen( &rcPaintGradient ); pWnd->ScreenToClient( &rcPaintGradient ); if( ::IsRectEmpty( &rcPaintGradient ) || ( ! dc.RectVisible( &rcPaintGradient ) ) ) return true; if( clrSolidShade0 != ((COLORREF)(-1L)) ) { if( clrSolidShade1 != ((COLORREF)(-1L)) ) stat_PaintGradientRect( dc, rcPaintGradient, clrSolidShade0, clrSolidShade1, true ); else dc.FillSolidRect( rcPaintGradient, clrSolidShade0 ); return true; } // if( clrSolidShade0 != ((COLORREF)(-1L)) ) CDC & dcCompat = CachedDcGet( bToolbarShade ? ( bToolbarHorz ? m_bmpCtBarGradientHorz : m_bmpCtBarGradientVert ) : m_bmpDockerGradient ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return false; } CSize sizeShade = bToolbarShade ? ( bToolbarHorz ? m_sizeCtBarGradientHorz : m_sizeCtBarGradientVert ) : m_sizeDockerGradient ; int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, sizeShade.cx, sizeShade.cy, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); return true; } void CExtPaintManager::PaintControlBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rcClient ) || ( ! dc.RectVisible( &rcClient ) ) ) return; dc.FillSolidRect( &rcClient, GetColor( CLR_3DFACE_OUT ) ); } void CExtPaintManagerXP::PaintControlBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManager::PaintControlBarClientArea( dc, rcClient, pHelperSrc, lParam ); } void CExtPaintManagerOffice2003::InitTranslatedColors() { m_nIdxClrBtnHoverLeft = -1; m_nIdxClrBtnHoverRight = -1; m_nIdxClrBtnPressedLeft = -1; m_nIdxClrBtnPressedRight = -1; m_nIdxClrBtnHovPresLeft = -1; m_nIdxClrBtnHovPresRight = -1; m_nIdxClrTbFillMargin = -1; g_PaintManager.m_bUxApiInitPassed = g_PaintManager.m_bUxValidColorsExtracted = false; g_PaintManager.InitUserExApi(); CExtPaintManagerXP::InitTranslatedColors(); if( m_bmpCtBarGradientHorz.GetSafeHandle() != NULL ) m_bmpCtBarGradientHorz.DeleteObject(); if( m_bmpCtBarGradientVert.GetSafeHandle() != NULL ) m_bmpCtBarGradientVert.DeleteObject(); if( m_bmpDockerGradient.GetSafeHandle() != NULL ) m_bmpDockerGradient.DeleteObject(); if( stat_GetBPP() > 8 ) { static const LONG g_nBarGradientSizeMetric = 256L; static const LONG g_nBarGradientPixelCount = 256L*256L; m_sizeCtBarGradientHorz.cx = m_sizeCtBarGradientHorz.cy = m_sizeCtBarGradientVert.cx = m_sizeCtBarGradientVert.cy = m_sizeDockerGradient.cx = m_sizeDockerGradient.cy = g_nBarGradientSizeMetric; CWindowDC dcDesktop( NULL ); if( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater ) { // if use WinXP themed colors double lfEdgeLightHue, lfEdgeLightSat, lfEdgeLightLum, lfEdgeShadowHue, lfEdgeShadowSat, lfEdgeShadowLum, lfCustFillHue, lfCustFillSat, lfCustFillLum; stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandEdgeLightColor, &lfEdgeLightHue, &lfEdgeLightSat, &lfEdgeLightLum ); stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandEdgeShadowColor, &lfEdgeShadowHue, &lfEdgeShadowSat, &lfEdgeShadowLum ); stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandFillColorHint, &lfCustFillHue, &lfCustFillSat, &lfCustFillLum ); COLORREF clrFillHint = stat_HLStoRGB( lfCustFillHue, (lfEdgeLightLum+lfEdgeShadowLum)/2.0, lfCustFillSat ); COLORREF clrAccentHint = g_PaintManager.m_clrUxTaskBandAccentColorHint; // re-install XP colors // xp - menu area light ver COLORREF xpclr_MenuLight = stat_HLS_Adjust( clrFillHint, 0.00, 0.95, -0.05 ); xpclr_MenuLight = RGB( GetRValue(xpclr_MenuLight) + ::MulDiv( 255 - GetRValue(xpclr_MenuLight), 40, 100 ), GetGValue(xpclr_MenuLight) + ::MulDiv( 255 - GetGValue(xpclr_MenuLight), 20, 100 ), GetBValue(xpclr_MenuLight) ); xpclr_MenuLight = stat_HLS_Adjust( xpclr_MenuLight, 0.00, 0.06, 0.05 ); // 2003 - float light COLORREF xpclr_FloatFace = stat_HLS_Adjust( clrFillHint, 0.00, 0.50, 0.00 ); // xp - rarely used item left side COLORREF xpclr_RarelyUsedMenuLeft = RGB( ( 999L*long(GetRValue(clrFillHint)) ) / 1000L, ( 995L*long(GetGValue(clrFillHint)) ) / 1000L, ( 995L*long(GetBValue(clrFillHint)) ) / 1000L ); // xp - control bar funny background COLORREF xpclr_ControlBarBk = stat_HLS_Adjust( clrFillHint, 0.00, 0.20, 0.00 ); // xp - orange like light ver COLORREF xpclr_Highlight = stat_HLS_Adjust( clrAccentHint, 0.00, 0.60, 0.45 ); // 2003 - dark orange COLORREF clr2003faceIn = stat_HLS_Adjust( clrAccentHint, 0.00, -0.30, 0.45 ); // xp - blue like dark ver COLORREF clrTmp = stat_HLS_Adjust( clrFillHint, 0.00, 0.20, 0.00 ); COLORREF xpclr_HighlightDarked = stat_HLS_Adjust( clrTmp, 0.00, -0.25, 0.10 ); // xp - dark selected border COLORREF xpclr_HighlightBorder = stat_HLS_Adjust( xpclr_HighlightDarked, 0.00, -0.50, 0.00 ); // xp - dark gray separator COLORREF xpclr_Separator = RGB( ( 857L*long(GetRValue(clrFillHint)) ) / 1000L, ( 857L*long(GetGValue(clrFillHint)) ) / 1000L, ( 857L*long(GetBValue(clrFillHint)) ) / 1000L ); // xp - dark panel border (for floating controlbars) COLORREF xpclr_PanelBorder = stat_HLS_Adjust( clrFillHint, 0.00, -0.25, 0.00 ); m_mapColorTranslate[CLR_3DFACE_OUT] = InstallColor( xpclr_ControlBarBk ); m_mapColorTranslate[CLR_3DFACE_IN] = InstallColor( xpclr_Highlight ); m_mapColorTranslate[CLR_3DFACE_DISABLED] = COLOR_3DFACE; int idxClrDark = InstallColor( xpclr_PanelBorder ); m_mapColorTranslate[CLR_3DLIGHT_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DLIGHT_IN] = idxClrDark; m_mapColorTranslate[CLR_3DLIGHT_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_IN] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_IN] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_IN] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_TEXT_OUT] = COLOR_BTNTEXT; m_mapColorTranslate[CLR_TEXT_IN] = COLOR_BTNTEXT; m_mapColorTranslate[CLR_TEXT_DISABLED] = COLOR_3DSHADOW; m_mapColorTranslate[XPCLR_PUSHEDHOVERTEXT] = COLOR_BTNTEXT; m_mapColorTranslate[XPCLR_3DFACE_DARK] = InstallColor( xpclr_ControlBarBk ); m_mapColorTranslate[XPCLR_3DFACE_NORMAL] = InstallColor( xpclr_MenuLight ); m_mapColorTranslate[XPCLR_SEPARATOR] = InstallColor( xpclr_Separator ); m_mapColorTranslate[XPCLR_HILIGHT] = //InstallColor( xpclr_HighlightDarked ); InstallColor( clr2003faceIn ); m_mapColorTranslate[XPCLR_HILIGHT_BORDER] = InstallColor( xpclr_HighlightBorder ); m_mapColorTranslate[XPCLR_RARELY_BORDER] = InstallColor( xpclr_RarelyUsedMenuLeft ); m_mapColorTranslate[XPCLR_MENU_BORDER] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.68, 0.00 ) ); m_mapColorTranslate[XPCLR_3DFACE_FLOAT_F] = InstallColor( xpclr_FloatFace ); // install new colors m_mapColorTranslate[_2003CLR_GRADIENT_LIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.30, 0.00 ) ); m_mapColorTranslate[_2003CLR_GRADIENT_DARK] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.00, 0.10 ) ); m_mapColorTranslate[_2003CLR_SEPARATOR_LIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.98, 0.00 ) ); m_mapColorTranslate[_2003CLR_SEPARATOR_DARK] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.45, -0.00 ) ); m_mapColorTranslate[_2003CLR_GRIPPER_DOT_DARK] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.60, 0.00 ) ); m_mapColorTranslate[_2003CLR_GRIPPER_DOT_LIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.95, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_LIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.10, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_DARK] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.60, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_HOVER_LIGHT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.85, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_HOVER_DARK] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, -0.05, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_PRESSED_LIGHT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.30, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_PRESSED_DARK] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, -0.30, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPGLYPH_LIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.97, 0.00 ) ); m_mapColorTranslate[_2003CLR_EXPGLYPH_DARK] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.97, 0.00 ) ); m_mapColorTranslate[_2003CLR_STATUSBAR_ITEM] = COLOR_3DSHADOW; // InstallColor( // stat_HLS_Adjust( // GetColor(XPCLR_3DFACE_NORMAL), // 0.0, -0.05, 0.0 // ) // ); m_mapColorTranslate[_2003CLR_MLA_NORM_LEFT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.75, 0.00 ) ); m_mapColorTranslate[_2003CLR_MLA_NORM_RIGHT] = InstallColor( stat_HLS_Adjust( GetColor( XPCLR_3DFACE_DARK ), 0.00, -0.10, 0.00 ) ); m_mapColorTranslate[_2003CLR_MLA_RARELY_LEFT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.30, 0.00 ) ); m_mapColorTranslate[_2003CLR_MLA_RARELY_RIGHT] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, -0.25, 0.00 ) ); m_mapColorTranslate[_2003CLR_BTN_HOVER_LEFT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.80, 0.00 ) ); m_mapColorTranslate[_2003CLR_BTN_HOVER_RIGHT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.20, 0.00 ) ); m_mapColorTranslate[_2003CLR_BTN_PRESSED_LEFT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.40, 0.00 ) ); m_mapColorTranslate[_2003CLR_BTN_PRESSED_RIGHT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, -0.05, 0.00 ) ); m_mapColorTranslate[_2003CLR_BTN_HP_LEFT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, -0.30, 0.75 ) ); m_mapColorTranslate[_2003CLR_BTN_HP_RIGHT] = InstallColor( stat_HLS_Adjust( clrAccentHint, 0.00, 0.50, 0.00 ) ); m_nIdxClrBtnHoverLeft = _2003CLR_BTN_HOVER_LEFT; m_nIdxClrBtnHoverRight = _2003CLR_BTN_HOVER_RIGHT; m_nIdxClrBtnPressedLeft = _2003CLR_BTN_PRESSED_LEFT; m_nIdxClrBtnPressedRight = _2003CLR_BTN_PRESSED_RIGHT; m_nIdxClrBtnHovPresLeft = _2003CLR_BTN_HP_LEFT; m_nIdxClrBtnHovPresRight = _2003CLR_BTN_HP_RIGHT; m_nIdxClrTbFillMargin = _2003CLR_EXPBTN_DARK; m_mapColorTranslate[_2003CLR_MENUEXPBALOON] = InstallColor( stat_HLS_Adjust( clrFillHint, 0.00, 0.77, 0.00 ) ); m_colors[COLOR_3DFACE] = clrFillHint; m_colors[COLOR_3DLIGHT] = stat_HLS_Adjust( clrFillHint, 0.00, 0.45, 0.10 ); m_colors[COLOR_3DHIGHLIGHT] = stat_HLS_Adjust( clrFillHint, 0.00, 0.75, 0.00 ); m_colors[COLOR_3DSHADOW] = stat_HLS_Adjust( clrFillHint, 0.00, -0.45, 0.10 ); m_colors[COLOR_3DDKSHADOW] = stat_HLS_Adjust( clrFillHint, 0.00, -0.75, 0.00 ); // init non-linear gradient bitmaps COLORREF clrLeft = stat_HLS_Adjust( GetColor( _2003CLR_GRADIENT_LIGHT ), 0.00, 0.50, 0.20 ); COLORREF clrRight = stat_HLS_Adjust( GetColor( _2003CLR_GRADIENT_DARK ), 0.00, -0.30, -0.20 ); COLORREF clrQuadLeft = RGB( GetBValue( clrLeft ), GetGValue( clrLeft ), GetRValue( clrLeft ) ); COLORREF clrQuadRight = RGB( GetBValue( clrRight ), GetGValue( clrRight ), GetRValue( clrRight ) ); double lfColorDist[3] = { double( GetRValue( clrQuadRight ) ) - double( GetRValue( clrQuadLeft ) ), double( GetGValue( clrQuadRight ) ) - double( GetGValue( clrQuadLeft ) ), double( GetBValue( clrQuadRight ) ) - double( GetBValue( clrQuadLeft ) ), }; // horizontal bar gradient BITMAPINFOHEADER bih; ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bih.biHeight = g_nBarGradientSizeMetric; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = g_nBarGradientPixelCount; COLORREF * pSurfaceCB = NULL; HBITMAP hDib = ::CreateDIBSection( dcDesktop, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pSurfaceCB, NULL, NULL ); ASSERT( hDib != NULL && pSurfaceCB != NULL ); if( hDib != NULL && pSurfaceCB != NULL ) { m_bmpCtBarGradientHorz.Attach( hDib ); for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) { for( LONG y = 0; y < g_nBarGradientSizeMetric; y++ ) { COLORREF * pClr = pSurfaceCB + g_nBarGradientPixelCount - (y * g_nBarGradientSizeMetric) - g_nBarGradientSizeMetric + x ; double lfColorOffset[3] = { lfColorDist[0], lfColorDist[1], lfColorDist[2], }; double lfQ = ( double(g_nBarGradientSizeMetric) - double(y)*2.0 ) / double(g_nBarGradientSizeMetric) ; ASSERT( (-1.0) <= lfQ && lfQ <= (1.0) ); double lfQ2 = lfQ * ( (lfQ > 0.0) ? lfQ : (-lfQ) ); lfQ = (lfQ*4.0 + lfQ2) / 5.0; for( int i = 0; i < 3; i++ ) { double & lfCV = lfColorOffset[i]; lfCV /= lfColorDist[i]; if( lfQ > 0.0 ) lfCV = lfCV + (1.0 - lfCV) * lfQ; else if ( lfQ < 0.0 ) lfCV = lfCV * (1.0 + lfQ); if( lfCV < 0.0 ) lfCV = 0.0; else if( lfCV > 1.0 ) lfCV = 1.0; lfCV *= lfColorDist[i]; } // for( int i = 0; i < 3; i++ ) *pClr = RGB( DWORD( double(GetRValue(clrQuadRight)) - lfColorOffset[0] ), DWORD( double(GetGValue(clrQuadRight)) - lfColorOffset[1] ), DWORD( double(GetBValue(clrQuadRight)) - lfColorOffset[2] ) ); } } // for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) } // if( hDib != NULL && pSurfaceCB != NULL ) // vertical bar gradient ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bih.biHeight = g_nBarGradientSizeMetric; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = g_nBarGradientPixelCount; pSurfaceCB = NULL; hDib = ::CreateDIBSection( dcDesktop, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pSurfaceCB, NULL, NULL ); ASSERT( hDib != NULL && pSurfaceCB != NULL ); if( hDib != NULL && pSurfaceCB != NULL ) { m_bmpCtBarGradientVert.Attach( hDib ); for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) { for( LONG y = 0; y < g_nBarGradientSizeMetric; y++ ) { COLORREF * pClr = pSurfaceCB + g_nBarGradientPixelCount - (y * g_nBarGradientSizeMetric) - g_nBarGradientSizeMetric + x ; double lfColorOffset[3] = { lfColorDist[0], lfColorDist[1], lfColorDist[2], }; double lfQ = ( double(g_nBarGradientSizeMetric) - double(x)*2.0 ) / double(g_nBarGradientSizeMetric) ; ASSERT( (-1.0) <= lfQ && lfQ <= (1.0) ); double lfQ2 = lfQ * ( (lfQ > 0.0) ? lfQ : (-lfQ) ); lfQ = (lfQ*4.0 + lfQ2) / 5.0; for( int i = 0; i < 3; i++ ) { double & lfCV = lfColorOffset[i]; lfCV /= lfColorDist[i]; if( lfQ > 0.0 ) lfCV = lfCV + (1.0 - lfCV) * lfQ; else if ( lfQ < 0.0 ) lfCV = lfCV * (1.0 + lfQ); if( lfCV < 0.0 ) lfCV = 0.0; else if( lfCV > 1.0 ) lfCV = 1.0; lfCV *= lfColorDist[i]; } // for( int i = 0; i < 3; i++ ) *pClr = RGB( DWORD( double(GetRValue(clrQuadRight)) - lfColorOffset[0] ), DWORD( double(GetGValue(clrQuadRight)) - lfColorOffset[1] ), DWORD( double(GetBValue(clrQuadRight)) - lfColorOffset[2] ) ); } } // for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) } // if( hDib != NULL && pSurfaceCB != NULL ) } // if use WinXP themed colors else { // if use system colors // install new colors m_mapColorTranslate[_2003CLR_GRADIENT_LIGHT] = COLOR_WINDOW; m_mapColorTranslate[_2003CLR_GRADIENT_DARK] = COLOR_3DFACE; m_mapColorTranslate[_2003CLR_SEPARATOR_LIGHT] = COLOR_WINDOW; m_mapColorTranslate[_2003CLR_SEPARATOR_DARK] = InstallColor( stat_HLS_Adjust( GetColor(COLOR_3DFACE), 0.0, -0.20, 0.0 ) ); m_mapColorTranslate[_2003CLR_GRIPPER_DOT_DARK] = InstallColor( stat_HLS_Adjust( GetColor(COLOR_3DSHADOW), 0.0, 0.20, 0.0 ) ); m_mapColorTranslate[_2003CLR_GRIPPER_DOT_LIGHT] = COLOR_WINDOW; m_mapColorTranslate[_2003CLR_EXPBTN_LIGHT] = InstallColor( stat_HLS_Adjust( GetColor(COLOR_3DSHADOW), 0.0, 0.25, 0.0 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_DARK] = InstallColor( stat_HLS_Adjust( GetColor(COLOR_3DSHADOW), 0.0, -0.10, 0.0 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_HOVER_LIGHT] = m_mapColorTranslate[_2003CLR_EXPBTN_HOVER_DARK] = InstallColor( stat_HLS_Adjust( GetColor(XPCLR_HILIGHT), 0.0, 0.30, 0.0 ) ); m_mapColorTranslate[_2003CLR_EXPBTN_PRESSED_LIGHT] = m_mapColorTranslate[_2003CLR_EXPBTN_PRESSED_DARK] = InstallColor( stat_HLS_Adjust( GetColor(XPCLR_HILIGHT), 0.0, 0.60, 0.0 ) ); m_mapColorTranslate[_2003CLR_EXPGLYPH_LIGHT] = COLOR_WINDOW; m_mapColorTranslate[_2003CLR_EXPGLYPH_DARK] = COLOR_3DDKSHADOW; m_mapColorTranslate[_2003CLR_STATUSBAR_ITEM] = COLOR_3DSHADOW; // InstallColor( // stat_HLS_Adjust( // GetColor(XPCLR_3DFACE_NORMAL), // 0.0, -0.05, 0.0 // ) // ); m_mapColorTranslate[_2003CLR_MLA_NORM_LEFT] = COLOR_WINDOW; m_mapColorTranslate[_2003CLR_MLA_NORM_RIGHT] = InstallColor( GetColor( XPCLR_3DFACE_DARK ) ); m_mapColorTranslate[_2003CLR_MLA_RARELY_LEFT] = InstallColor( GetColor( XPCLR_3DFACE_NORMAL ) ); m_mapColorTranslate[_2003CLR_MLA_RARELY_RIGHT] = COLOR_3DFACE; m_mapColorTranslate[_2003CLR_MENUEXPBALOON] = COLOR_WINDOW; // reinit XP colors m_mapColorTranslate[XPCLR_3DFACE_NORMAL] = InstallColor( stat_HLS_Adjust( GetColor(XPCLR_3DFACE_NORMAL), 0.0, 0.30, 0.0 ) ); // init non-linear gradient bitmaps COLORREF clrLeft = GetColor( _2003CLR_GRADIENT_LIGHT ); COLORREF clrRight = GetColor( _2003CLR_GRADIENT_DARK ); COLORREF clrQuadLeft = RGB( GetBValue( clrLeft ), GetGValue( clrLeft ), GetRValue( clrLeft ) ); COLORREF clrQuadRight = RGB( GetBValue( clrRight ), GetGValue( clrRight ), GetRValue( clrRight ) ); double lfColorDist[3] = { double( GetRValue( clrQuadRight ) ) - double( GetRValue( clrQuadLeft ) ), double( GetGValue( clrQuadRight ) ) - double( GetGValue( clrQuadLeft ) ), double( GetBValue( clrQuadRight ) ) - double( GetBValue( clrQuadLeft ) ), }; double lfTmp = ::sqrt( double(g_nBarGradientSizeMetric) * double(g_nBarGradientSizeMetric) * 2.0 ); double lfMaxDist = lfTmp + ::sqrt( lfTmp ); // horizontal bar gradient BITMAPINFOHEADER bih; ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bih.biHeight = g_nBarGradientSizeMetric; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = g_nBarGradientPixelCount; COLORREF * pSurfaceCB = NULL; HBITMAP hDib = ::CreateDIBSection( dcDesktop, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pSurfaceCB, NULL, NULL ); ASSERT( hDib != NULL && pSurfaceCB != NULL ); if( hDib != NULL && pSurfaceCB != NULL ) { m_bmpCtBarGradientHorz.Attach( hDib ); for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) { for( LONG y = 0; y < g_nBarGradientSizeMetric; y++ ) { COLORREF * pClr = pSurfaceCB + g_nBarGradientPixelCount - (y * g_nBarGradientSizeMetric) - g_nBarGradientSizeMetric + x ; lfTmp = ::sqrt( double(x) * double(x) + double(y) * double(y) ); double lfPixelDist = lfTmp + ::sqrt( lfTmp ); ASSERT( lfPixelDist <= lfMaxDist ); double lfPercent = ::sqrt( 1.0 - lfPixelDist / lfMaxDist ); double lfColorOffset[3] = { lfColorDist[0]*lfPercent, lfColorDist[1]*lfPercent, lfColorDist[2]*lfPercent, }; double lfQ = ( double(g_nBarGradientSizeMetric) - double(y)*2.0 ) / double(g_nBarGradientSizeMetric) ; ASSERT( (-1.0) <= lfQ && lfQ <= (1.0) ); lfQ *= lfQ*lfQ; for( int i = 0; i < 3; i++ ) { double & lfCV = lfColorOffset[i]; lfCV /= lfColorDist[i]; if( lfQ > 0.0 ) lfCV = lfCV + (1.0 - lfCV) * lfQ; else if ( lfQ < 0.0 ) lfCV = lfCV * (1.0 + lfQ); if( lfCV < 0.0 ) lfCV = 0.0; else if( lfCV > 1.0 ) lfCV = 1.0; lfCV *= lfColorDist[i]; } // for( int i = 0; i < 3; i++ ) *pClr = RGB( DWORD( double(GetRValue(clrQuadRight)) - lfColorOffset[0] ), DWORD( double(GetGValue(clrQuadRight)) - lfColorOffset[1] ), DWORD( double(GetBValue(clrQuadRight)) - lfColorOffset[2] ) ); } } // for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) } // if( hDib != NULL && pSurfaceCB != NULL ) // vertical bar gradient ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bih.biHeight = g_nBarGradientSizeMetric; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = g_nBarGradientPixelCount; pSurfaceCB = NULL; hDib = ::CreateDIBSection( dcDesktop, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pSurfaceCB, NULL, NULL ); ASSERT( hDib != NULL && pSurfaceCB != NULL ); if( hDib != NULL && pSurfaceCB != NULL ) { m_bmpCtBarGradientVert.Attach( hDib ); for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) { for( LONG y = 0; y < g_nBarGradientSizeMetric; y++ ) { COLORREF * pClr = pSurfaceCB + g_nBarGradientPixelCount - (y * g_nBarGradientSizeMetric) - g_nBarGradientSizeMetric + x ; lfTmp = ::sqrt( double(x) * double(x) + double(y) * double(y) ); double lfPixelDist = lfTmp + ::sqrt( lfTmp ); ASSERT( lfPixelDist <= lfMaxDist ); double lfPercent = ::sqrt( 1.0 - lfPixelDist / lfMaxDist ); double lfColorOffset[3] = { lfColorDist[0]*lfPercent, lfColorDist[1]*lfPercent, lfColorDist[2]*lfPercent, }; double lfQ = ( double(g_nBarGradientSizeMetric) - double(x)*2.0 ) / double(g_nBarGradientSizeMetric) ; ASSERT( (-1.0) <= lfQ && lfQ <= (1.0) ); lfQ *= lfQ*lfQ; for( int i = 0; i < 3; i++ ) { double & lfCV = lfColorOffset[i]; lfCV /= lfColorDist[i]; if( lfQ > 0.0 ) lfCV = lfCV + (1.0 - lfCV) * lfQ; else if ( lfQ < 0.0 ) lfCV = lfCV * (1.0 + lfQ); if( lfCV < 0.0 ) lfCV = 0.0; else if( lfCV > 1.0 ) lfCV = 1.0; lfCV *= lfColorDist[i]; } // for( int i = 0; i < 3; i++ ) *pClr = RGB( DWORD( double(GetRValue(clrQuadRight)) - lfColorOffset[0] ), DWORD( double(GetGValue(clrQuadRight)) - lfColorOffset[1] ), DWORD( double(GetBValue(clrQuadRight)) - lfColorOffset[2] ) ); } } // for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) } // if( hDib != NULL && pSurfaceCB != NULL ) } // if use system colors // docker gradient COLORREF clrLeft = GetColor( _2003CLR_GRADIENT_LIGHT ); COLORREF clrRight = GetColor( _2003CLR_GRADIENT_DARK ); COLORREF clrQuadLeft = RGB( GetBValue( clrLeft ), GetGValue( clrLeft ), GetRValue( clrLeft ) ); COLORREF clrQuadRight = RGB( GetBValue( clrRight ), GetGValue( clrRight ), GetRValue( clrRight ) ); double lfColorDist[3] = { double( GetRValue( clrQuadRight ) ) - double( GetRValue( clrQuadLeft ) ), double( GetGValue( clrQuadRight ) ) - double( GetGValue( clrQuadLeft ) ), double( GetBValue( clrQuadRight ) ) - double( GetBValue( clrQuadLeft ) ), }; BITMAPINFOHEADER bih; ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) ); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bih.biHeight = g_nBarGradientSizeMetric; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = g_nBarGradientPixelCount; COLORREF * pSurfaceDB = NULL; HBITMAP hDib = ::CreateDIBSection( dcDesktop, (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&pSurfaceDB, NULL, NULL ); ASSERT( hDib != NULL && pSurfaceDB != NULL ); if( hDib != NULL && pSurfaceDB != NULL ) { m_bmpDockerGradient.Attach( hDib ); double lfMaxDist = ::sqrt( double(g_nBarGradientSizeMetric) * double(g_nBarGradientSizeMetric) * 1.4 + ( double(g_nBarGradientSizeMetric) * double(g_nBarGradientSizeMetric) ) / ( 4.0 * 4.0 ) ); for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) { for( LONG y = 0; y < g_nBarGradientSizeMetric; y++ ) { COLORREF * pClr = pSurfaceDB + g_nBarGradientPixelCount - (y * g_nBarGradientSizeMetric) - g_nBarGradientSizeMetric + x ; double lfPixelDist = ::sqrt( double(x) * double(x) + ( double(y) * double(y) ) / ( 8.0 * 8.0 ) ); ASSERT( lfPixelDist <= lfMaxDist ); double lfPercent = 1.0 - lfPixelDist / lfMaxDist; double lfColorOffset[3] = { lfColorDist[0]*lfPercent, lfColorDist[1]*lfPercent, lfColorDist[2]*lfPercent, }; *pClr = RGB( DWORD( double(GetRValue(clrQuadLeft)) + lfColorOffset[0] ), DWORD( double(GetGValue(clrQuadLeft)) + lfColorOffset[1] ), DWORD( double(GetBValue(clrQuadLeft)) + lfColorOffset[2] ) ); } } // for( LONG x = 0; x < g_nBarGradientSizeMetric; x++ ) } // if( hDib != NULL && pSurfaceCB != NULL ) } // if( stat_GetBPP() > 8 ) else { m_mapColorTranslate[_2003CLR_STATUSBAR_ITEM] = InstallColor( GetColor(COLOR_3DSHADOW) ); } // else from if( stat_GetBPP() > 8 ) } void CExtPaintManagerOffice2003::PaintControlBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rcClient ) || ( ! dc.RectVisible( &rcClient ) ) ) return; CExtToolControlBar * pToolBar = NULL; CWnd * pFrame = NULL; if( pHelperSrc != NULL ) { pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pHelperSrc ); if( pToolBar != NULL ) { if( !( pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) || pToolBar->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) ) ) { // not menu bar, not panel bar if( pToolBar->m_pDockSite != NULL ) { if( pToolBar->IsFloating() ) pToolBar = NULL; } // if( pToolBar->m_pDockSite != NULL ) else { CWnd * pWndOwner = pToolBar->GetOwner(); if( pWndOwner != NULL ) { pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndOwner ); if( pFrame == NULL ) { if( (pWndOwner->GetStyle() & WS_CHILD) != 0 ) pFrame = pWndOwner->GetParentFrame(); } // if( pFrame == NULL ) if( pFrame != NULL ) { if( pFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) ) { // if ext mini dock frame } // if ext mini dock frame else { CControlBar * pDocker = ((CFrameWnd *)pFrame)-> GetControlBar( AFX_IDW_DOCKBAR_TOP ); if( pDocker == NULL ) { pFrame = NULL; pToolBar = NULL; } else if( !pDocker->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) { pFrame = NULL; pToolBar = NULL; } } } // if( pFrame != NULL ) } // if( pWndOwner != NULL ) } // else from if( pToolBar->m_pDockSite != NULL ) } // not menu bar, not panel bar } // if( pToolBar != NULL ) } // if( pHelperSrc != NULL ) if( pToolBar == NULL || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintControlBarClientArea( dc, rcClient, pHelperSrc, lParam ); return; } CRect rcPaintGradient; if( pFrame == NULL ) pFrame = (pToolBar->m_pDockSite == NULL) ? pToolBar->GetParent() : pToolBar->GetParentFrame() ; ASSERT_VALID( pFrame ); pFrame->GetClientRect( &rcPaintGradient ); pFrame->ClientToScreen( &rcPaintGradient ); pToolBar->ScreenToClient( &rcPaintGradient ); if( ::IsRectEmpty( &rcPaintGradient ) || ( ! dc.RectVisible( &rcPaintGradient ) ) ) return; CDC & dcCompat = CachedDcGet( m_bmpDockerGradient ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return; } int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, m_sizeDockerGradient.cx, m_sizeDockerGradient.cy, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); bool bHorz = true; if( pToolBar->IsDocked() ) bHorz = (! pToolBar->IsDockedVertically() ); if( pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) || pToolBar->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) || pToolBar->m_pDockSite == NULL ) { // if dockbar-like background style return; } // if dockbar-like background style pToolBar->GetWindowRect( &rcPaintGradient ); pToolBar->ScreenToClient( &rcPaintGradient ); CBitmap * pBmpOld = dcCompat.SelectObject( bHorz ? ( &m_bmpCtBarGradientHorz ) : ( &m_bmpCtBarGradientVert ) ); CSize sizeShade = bHorz ? m_sizeCtBarGradientHorz : m_sizeCtBarGradientVert ; nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); int nIdxClrTbFillMargin = -1; CRgn _rgnBaloonRight, _rgnBaloonLeft, _rgnBaloonSet; if( m_sizeToolBarRgnRounders.cx > 0 && m_sizeToolBarRgnRounders.cy > 0 && pToolBar->IsDocked() ) { // if baloon style nIdxClrTbFillMargin = m_nIdxClrTbFillMargin; if( _rgnBaloonRight.CreateRoundRectRgn( 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy ) && _rgnBaloonLeft.CreateRectRgn( 0, 0, bHorz ? (m_sizeToolBarRgnRounders.cx + 2) : (rcClient.right - rcClient.left - 1), bHorz ? (rcClient.bottom - rcClient.top - 1) : (m_sizeToolBarRgnRounders.cy + 2) ) && _rgnBaloonSet.CreateRectRgn( 0, 0, 1, 1 ) && _rgnBaloonSet.CombineRgn( &_rgnBaloonLeft, &_rgnBaloonRight, RGN_OR ) != ERROR ) { dc.SelectClipRgn( &_rgnBaloonSet ); } #ifdef _DEBUG else { ASSERT( FALSE ); } #endif // _DEBUG } // if baloon style dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, sizeShade.cx, sizeShade.cy, SRCCOPY ); if( nIdxClrTbFillMargin >= 0 ) { CPen _pen( PS_SOLID, 1, GetColor(m_nIdxClrTbFillMargin) ); CPen * pOldPen = dc.SelectObject( &_pen ); CRect rcClient; pToolBar->GetClientRect( &rcClient ); if( bHorz ) { dc.MoveTo( rcClient.left, rcClient.bottom-2 ); dc.LineTo( rcClient.right, rcClient.bottom-2 ); } // if( bHorz ) else { dc.MoveTo( rcClient.right-2, rcClient.top ); dc.LineTo( rcClient.right-2, rcClient.bottom ); } // else from if( bHorz ) dc.SelectObject( pOldPen ); } // if( nIdxClrTbFillMargin >= 0 ) if( _rgnBaloonSet.GetSafeHandle() != NULL ) dc.SelectClipRgn( NULL ); dc.SetStretchBltMode( nOldStretchBltMode ); dcCompat.SelectObject( pBmpOld ); } void CExtPaintManagerOffice2003::PaintDockBarClientArea( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( ::IsRectEmpty( &rcClient ) || ( ! dc.RectVisible( &rcClient ) ) ) return; CRect rcPaintGradient( 0, 0, 0, 0 ); CExtDockOuterBar * pOuterDocker = NULL; if( pHelperSrc != NULL ) { pOuterDocker = DYNAMIC_DOWNCAST( CExtDockOuterBar, pHelperSrc ); if( pOuterDocker != NULL ) { CFrameWnd * pFrame = pOuterDocker->GetParentFrame(); ASSERT_VALID( pFrame ); pFrame->GetClientRect( &rcPaintGradient ); pFrame->ClientToScreen( &rcPaintGradient ); pOuterDocker->ScreenToClient( &rcPaintGradient ); if( ::IsRectEmpty( &rcPaintGradient ) || ( ! dc.RectVisible( &rcPaintGradient ) ) ) return; } } if( pOuterDocker == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintDockBarClientArea( dc, rcClient, pHelperSrc, lParam ); return; } CDC & dcCompat = CachedDcGet( m_bmpDockerGradient ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return; } int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, m_sizeDockerGradient.cx, m_sizeDockerGradient.cy, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); } CExtPaintManager::PAINTDOCKINGFRAMEDATA::PAINTDOCKINGFRAMEDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcWindow( 0,0,0,0 ) , m_rcClient( 0,0,0,0 ) , m_bFloating( false ) , m_bExtBar( false ) , m_bSideBar( false ) { } CExtPaintManager::PAINTDOCKINGFRAMEDATA::PAINTDOCKINGFRAMEDATA( CObject * pHelperSrc, const RECT & rcWindow, const RECT & rcClient, bool bFloating, bool bExtBar, bool bSideBar // = false ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcWindow( rcWindow ) , m_rcClient( rcClient ) , m_bFloating( bFloating ) , m_bExtBar( bExtBar ) , m_bSideBar( bSideBar ) { } void CExtPaintManager::PaintDockingFrame( CDC & dc, CExtPaintManager::PAINTDOCKINGFRAMEDATA & _pdfd ) { if( _pdfd.m_rcWindow.IsRectEmpty() ) return; dc.ExcludeClipRect( _pdfd.m_rcClient ); CRect rcWnd( _pdfd.m_rcWindow ); COLORREF clr3dFace = GetColor(CLR_3DFACE_OUT); COLORREF clr3dHilight = GetColor(CLR_3DHILIGHT_OUT); COLORREF clr3dShadow = GetColor(CLR_3DSHADOW_OUT); COLORREF clr3dDkShadow = GetColor(CLR_3DDKSHADOW_OUT); dc.FillSolidRect( &rcWnd, clr3dFace ); if( _pdfd.m_bFloating ) { dc.Draw3dRect( &rcWnd, clr3dFace, clr3dDkShadow); rcWnd.DeflateRect(1,1); dc.Draw3dRect( &rcWnd, clr3dHilight, clr3dShadow); } else { if( !_pdfd.m_bExtBar ) { dc.Draw3dRect( &rcWnd, clr3dHilight, clr3dShadow); } } dc.IntersectClipRect( _pdfd.m_rcWindow ); } void CExtPaintManagerXP::PaintDockingFrame( CDC & dc, CExtPaintManager::PAINTDOCKINGFRAMEDATA & _pdfd ) { if( _pdfd.m_rcWindow.IsRectEmpty() ) return; dc.ExcludeClipRect( _pdfd.m_rcClient ); CRect rcWnd( _pdfd.m_rcWindow ); COLORREF clr3dFace = GetColor(COLOR_3DFACE); COLORREF clrDark = GetColor(COLOR_3DSHADOW); COLORREF clrBkOld = dc.GetBkColor(); COLORREF clrBkNew = GetColor( ( _pdfd.m_bFloating ) ? ( _pdfd.m_bExtBar ? XPCLR_3DFACE_FLOAT_R : XPCLR_3DFACE_FLOAT_F ) : CLR_3DFACE_OUT ); dc.FillSolidRect( &rcWnd, clrBkNew ); if( _pdfd.m_bFloating ) { dc.Draw3dRect( &rcWnd, clrDark, clrDark); rcWnd.DeflateRect(1,1); dc.Draw3dRect( &rcWnd, clrDark, clrDark); rcWnd.DeflateRect(1,1,2,2); dc.SetPixel( rcWnd.left, rcWnd.top, clrDark ); dc.SetPixel( rcWnd.left, rcWnd.bottom, clrDark ); dc.SetPixel( rcWnd.right, rcWnd.top, clrDark ); dc.SetPixel( rcWnd.right, rcWnd.bottom, clrDark ); } // if( _pdfd.m_bFloating ) else { if( !_pdfd.m_bExtBar ) dc.Draw3dRect( &rcWnd, clr3dFace, clr3dFace); if( !_pdfd.m_bSideBar && stat_GetBPP() <= 8 ) { static WORD hatchBits[8] = { 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, }; CBrush br; CBitmap bmp; bmp.CreateBitmap( 8, 8, 1, 1, hatchBits ); br.CreatePatternBrush( &bmp ); LOGBRUSH lbr; br.GetLogBrush( &lbr ); HPEN hPenDesired = ::ExtCreatePen( PS_GEOMETRIC, 1, &lbr, 0, NULL ); if( hPenDesired == NULL ) { COLORREF clrDesiredSolidPen = GetColor( COLOR_3DSHADOW ); hPenDesired = ::CreatePen( PS_SOLID, 1, clrDesiredSolidPen ); if( hPenDesired == NULL ) { hPenDesired = (HPEN) ::GetStockObject(BLACK_PEN); ASSERT( hPenDesired != NULL ); } // if( hPenDesired == NULL ) } // if( hPenDesired == NULL ) // CPen pen( PS_GEOMETRIC, 1, &lbr ); CPen pen; VERIFY( pen.Attach( hPenDesired ) ); CPen * pOldPen = dc.SelectObject( &pen ); if( m_bHelperXpStyle8BitBarRect ) { dc.MoveTo( rcWnd.left, rcWnd.top ); dc.LineTo( rcWnd.right-1, rcWnd.top ); dc.LineTo( rcWnd.right-1, rcWnd.bottom-1 ); dc.LineTo( rcWnd.left, rcWnd.bottom-1 ); dc.LineTo( rcWnd.left, rcWnd.top ); } // if( m_bHelperXpStyle8BitBarRect ) else { static const SIZE g_sizeRO = { 2, 2 }; dc.MoveTo( rcWnd.left+g_sizeRO.cx, rcWnd.top ); dc.LineTo( rcWnd.right-1-g_sizeRO.cx, rcWnd.top ); dc.LineTo( rcWnd.right-1, rcWnd.top+g_sizeRO.cy ); dc.LineTo( rcWnd.right-1, rcWnd.bottom-1-g_sizeRO.cy ); dc.LineTo( rcWnd.right-1-g_sizeRO.cx, rcWnd.bottom-1 ); dc.LineTo( rcWnd.left+g_sizeRO.cx, rcWnd.bottom-1 ); dc.LineTo( rcWnd.left, rcWnd.bottom-1-g_sizeRO.cy ); dc.LineTo( rcWnd.left, rcWnd.top+g_sizeRO.cy ); dc.LineTo( rcWnd.left+g_sizeRO.cx, rcWnd.top ); } // else from if( m_bHelperXpStyle8BitBarRect ) dc.SelectObject( pOldPen ); } // if( !_pdfd.m_bSideBar && stat_GetBPP() < 8 ) } // else from if( _pdfd.m_bFloating ) dc.SetBkColor( clrBkOld ); //dc.IntersectClipRect(rectWindow); dc.SelectClipRgn(NULL); } void CExtPaintManagerOffice2003::PaintDockingFrame( CDC & dc, CExtPaintManager::PAINTDOCKINGFRAMEDATA & _pdfd ) { if( _pdfd.m_rcWindow.IsRectEmpty() ) return; if( _pdfd.m_bFloating //|| (!_pdfd.m_bExtBar) //|| _pdfd.m_bSideBar || _pdfd.m_pHelperSrc == NULL || (! _pdfd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) ) || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintDockingFrame( dc, _pdfd ); return; } CExtControlBar * pControlBar = STATIC_DOWNCAST( CExtControlBar, _pdfd.m_pHelperSrc ); ASSERT_VALID( pControlBar ); CWnd * pFrame = NULL; if( pControlBar->m_pDockSite == NULL ) { CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pControlBar ); if( pToolBar != NULL ) { if( !( pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) || pToolBar->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) ) ) { // not menu bar, not panel bar CWnd * pWndOwner = pToolBar->GetOwner(); if( pWndOwner != NULL ) { pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndOwner ); if( pFrame == NULL ) { if( (pWndOwner->GetStyle() & WS_CHILD) != 0 ) pFrame = pWndOwner->GetParentFrame(); } // if( pFrame == NULL ) if( pFrame != NULL ) { if( pFrame->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) ) { // if ext mini dock frame } // if ext mini dock frame else { CControlBar * pDocker = ((CFrameWnd *)pFrame)-> GetControlBar( AFX_IDW_DOCKBAR_TOP ); if( pDocker == NULL ) pFrame = NULL; else if( !pDocker->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar)) ) pFrame = NULL; } } // if( pFrame != NULL ) } // if( pWndOwner != NULL ) } // not menu bar, not panel bar } // if( pToolBar != NULL ) } // if( pControlBar->m_pDockSite == NULL ) if( pFrame == NULL ) pFrame = (pControlBar->m_pDockSite == NULL) ? pControlBar->GetParent() : pControlBar->GetParentFrame() ; ASSERT_VALID( pFrame ); CRect rcPaintGradient; pFrame->GetClientRect( &rcPaintGradient ); pFrame->ClientToScreen( &rcPaintGradient ); CRect rcBar; pControlBar->GetWindowRect( &rcBar ); rcPaintGradient.OffsetRect( -rcBar.TopLeft() ); if( ::IsRectEmpty( &rcPaintGradient ) || ( ! dc.RectVisible( &rcPaintGradient ) ) ) return; CDC & dcCompat = CachedDcGet( m_bmpDockerGradient ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return; } int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, m_sizeDockerGradient.cx, m_sizeDockerGradient.cy, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); } CExtPaintManager::PAINTGRIPPERDATA::PAINTGRIPPERDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_rcGripper( 0,0,0,0 ) , m_rcText( 0,0,0,0 ) , m_bActive( false ) , m_bFloating( false ) , m_bHorz( false ) , m_bSideBar( false ) , m_sCaption( _T("") ) , m_bHelperNoRect( false ) , m_bHelperNoFill( false ) { } CExtPaintManager::PAINTGRIPPERDATA::PAINTGRIPPERDATA( CObject * pHelperSrc, const RECT & rcGripper, const RECT & rcText, bool bActive, bool bFloating, bool bHorz, bool bSideBar, // = false __EXT_MFC_SAFE_LPCTSTR sCaption // = NULL ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_rcGripper( rcGripper ) , m_rcText( rcText ) , m_bActive( bActive ) , m_bFloating( bFloating ) , m_bHorz( bHorz ) , m_bSideBar( bSideBar ) , m_sCaption( (sCaption == NULL) ? _T("") : sCaption ) , m_bHelperNoRect( false ) , m_bHelperNoFill( false ) { } void CExtPaintManager::PaintGripper( CDC & dc, CExtPaintManager::PAINTGRIPPERDATA & _pgd ) { CRect rectGripper2( _pgd.m_rcGripper ); COLORREF clrBtnShadow = GetColor(CLR_3DSHADOW_OUT); COLORREF clrBtnHilight = GetColor(CLR_3DHILIGHT_OUT); if( _pgd.m_bSideBar || _pgd.m_bFloating ) { if( !_pgd.m_bFloating ) rectGripper2.DeflateRect( 1, 1 ); #if (defined COLOR_GRADIENTACTIVECAPTION && defined COLOR_GRADIENTACTIVECAPTION) ASSERT( COLOR_GRADIENTACTIVECAPTION == 27 ); ASSERT( COLOR_GRADIENTINACTIVECAPTION == 28 ); #endif INT nTextColorIndex = COLOR_HIGHLIGHTTEXT; if( _pgd.m_bSideBar ) { if( _pgd.m_bFloating || _pgd.m_bActive ) { nTextColorIndex = COLOR_CAPTIONTEXT; if( stat_GetBPP() > 8 ) { stat_PaintGradientRect( dc, rectGripper2, GetColor( COLOR_ACTIVECAPTION ), GetColor( 27 ), _pgd.m_bHorz ); } // if( stat_GetBPP() > 8 ) else { dc.FillSolidRect( rectGripper2, GetColor( COLOR_ACTIVECAPTION ) ); } // else from if( stat_GetBPP() > 8 ) } else { nTextColorIndex = COLOR_INACTIVECAPTIONTEXT; if( stat_GetBPP() > 8 ) { stat_PaintGradientRect( dc, rectGripper2, GetColor( COLOR_INACTIVECAPTION ), GetColor( 28 ), _pgd.m_bHorz ); } // if( stat_GetBPP() > 8 ) else { dc.FillSolidRect( rectGripper2, GetColor( COLOR_INACTIVECAPTION ) ); } // else from if( stat_GetBPP() > 8 ) } } // if( _pgd.m_bSideBar ) else { dc.FillSolidRect( rectGripper2, GetColor( COLOR_HIGHLIGHT ) ); } // else from if( _pgd.m_bSideBar ) int nTextLen = 0; if( _pgd.m_sCaption != NULL && ( nTextLen = _tcslen(_pgd.m_sCaption) ) > 0 && !_pgd.m_rcText.IsRectEmpty() && _pgd.m_rcText.right > _pgd.m_rcText.left && _pgd.m_rcText.bottom > _pgd.m_rcText.top ) { COLORREF clrText = GetColor( nTextColorIndex /* COLOR_HIGHLIGHTTEXT */ ); COLORREF clrOldText = dc.SetTextColor(clrText); int nOldBkMode = dc.SetBkMode(TRANSPARENT); CFont * pCurrFont = (!_pgd.m_bHorz) ? &m_FontBoldBC : &m_FontBoldVertXBC ; CFont * pOldFont = dc.SelectObject( pCurrFont ); ASSERT( pOldFont != NULL ); if( !_pgd.m_bHorz ) { // if text is horizontal dc.DrawText( _pgd.m_sCaption, nTextLen, (LPRECT)&_pgd.m_rcText, DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS ); } // if text is horizontal else { // if text is vertical LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); pCurrFont->GetLogFont(&lf); int _cyHorzFont = abs(lf.lfHeight); int _cyTextMargin = (_pgd.m_rcText.Width() - _cyHorzFont) / 2 ; CRect rcString = CRect( CPoint( _pgd.m_rcText.left + _cyTextMargin - __ExtMfc_CXTEXTMARGIN, _pgd.m_rcText.bottom - __ExtMfc_CYTEXTMARGIN ), _pgd.m_rcText.Size() //m_sizeHorz ); rcString.DeflateRect(2,2); CRect rcExclude; rcExclude.SetRect( _pgd.m_rcGripper.left, _pgd.m_rcGripper.top, _pgd.m_rcGripper.right, _pgd.m_rcText.top ); dc.ExcludeClipRect( &rcExclude ); dc.DrawText( _pgd.m_sCaption, nTextLen, rcString, DT_SINGLELINE //|DT_CENTER|DT_VCENTER |DT_NOCLIP |DT_NOPREFIX ); // don't forget DT_NOCLIP //dc.IntersectClipRect( &rectGripper ); dc.SelectClipRgn(NULL); } // if text is vertical dc.SelectObject( pOldFont ); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); } } // if( _pgd.m_bSideBar || _pgd.m_bFloating ) else { if( _pgd.m_bHorz ) { rectGripper2.DeflateRect( 4, 1, 4, 0 ); rectGripper2.right = rectGripper2.left + 3; dc.Draw3dRect( rectGripper2, clrBtnHilight, clrBtnShadow ); rectGripper2.OffsetRect( 3, 0 ); dc.Draw3dRect( rectGripper2, clrBtnHilight, clrBtnShadow ); } // if( bHorz ) else { rectGripper2.OffsetRect( 1, 0 ); rectGripper2.DeflateRect( 0, 4, 1, 4 ); rectGripper2.bottom = rectGripper2.top + 3; dc.Draw3dRect( rectGripper2, clrBtnHilight, clrBtnShadow ); rectGripper2.OffsetRect( 0, 3 ); dc.Draw3dRect( rectGripper2, clrBtnHilight, clrBtnShadow ); } // else from if( bHorz ) } // else from if( _pgd.m_bSideBar || _pgd.m_bFloating ) } void CExtPaintManagerXP::PaintGripper( CDC & dc, CExtPaintManager::PAINTGRIPPERDATA & _pgd ) { CRect rectGripper2( _pgd.m_rcGripper ); if( _pgd.m_bSideBar || _pgd.m_bFloating ) { COLORREF clrGrip = GetColor( //COLOR_HIGHLIGHT _pgd.m_bSideBar ? (_pgd.m_bActive ? COLOR_HIGHLIGHT : XPCLR_3DFACE_DARK ) : COLOR_3DSHADOW ); if( !_pgd.m_bHelperNoFill ) dc.FillSolidRect( rectGripper2, clrGrip ); if( _pgd.m_bSideBar && (!_pgd.m_bHelperNoFill) && (!_pgd.m_bFloating) && (!_pgd.m_bActive) ) { // rect border of docked bar caption like VS-.NET-7.0 COLORREF clrSideRect = GetColor( COLOR_3DSHADOW ); stat_PaintDotNet3dRect( dc, rectGripper2, clrSideRect, clrSideRect ); } // rect border of docked bar caption like VS-.NET-7.0 int nTextLen = 0; if( _pgd.m_sCaption != NULL && ( nTextLen = _tcslen( _pgd.m_sCaption ) ) > 0 && !_pgd.m_rcText.IsRectEmpty() && _pgd.m_rcText.right > _pgd.m_rcText.left && _pgd.m_rcText.bottom > _pgd.m_rcText.top ) { COLORREF clrText = GetColor( (_pgd.m_bSideBar) ? (_pgd.m_bActive ? COLOR_HIGHLIGHTTEXT : COLOR_BTNTEXT) : COLOR_HIGHLIGHTTEXT ); COLORREF clrOldText = dc.SetTextColor(clrText); int nOldBkMode = dc.SetBkMode(TRANSPARENT); CFont * pCurrFont = (!_pgd.m_bHorz) ? ( _pgd.m_bSideBar ? &m_FontNormalBC : &m_FontBoldBC ) : ( _pgd.m_bSideBar ? &m_FontNormalVertXBC : &m_FontBoldVertXBC ) ; CFont * pOldFont = dc.SelectObject( pCurrFont ); ASSERT( pOldFont != NULL ); if( !_pgd.m_bHorz ) { // if text is horizontal dc.DrawText( _pgd.m_sCaption, nTextLen, (LPRECT)&_pgd.m_rcText, DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS ); } // if text is horizontal else { // if text is vertical LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); pCurrFont->GetLogFont(&lf); int _cyHorzFont = abs(lf.lfHeight); int _cyTextMargin = (_pgd.m_rcText.Width() - _cyHorzFont) / 2 ; CRect rcString = CRect( CPoint( _pgd.m_rcText.left + _cyTextMargin - __ExtMfc_CXTEXTMARGIN, _pgd.m_rcText.bottom - __ExtMfc_CYTEXTMARGIN ), _pgd.m_rcText.Size() //m_sizeHorz ); rcString.DeflateRect(2,2); CRect rcExclude; rcExclude.SetRect( _pgd.m_rcGripper.left, _pgd.m_rcGripper.top, _pgd.m_rcGripper.right, _pgd.m_rcText.top ); dc.ExcludeClipRect( &rcExclude ); dc.DrawText( _pgd.m_sCaption, nTextLen, rcString, DT_SINGLELINE //|DT_CENTER|DT_VCENTER |DT_NOCLIP |DT_NOPREFIX ); // don't forget DT_NOCLIP //dc.IntersectClipRect( &rectGripper ); dc.SelectClipRgn(NULL); } // if text is vertical dc.SelectObject( pOldFont ); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOldText); } } // if( _pgd.m_bSideBar || _pgd.m_bFloating ) else { COLORREF clrGrip = GetColor(CLR_3DFACE_OUT); CRect rcGripToClear( _pgd.m_rcGripper ); rcGripToClear.DeflateRect( 1, 1 ); dc.FillSolidRect( rcGripToClear, clrGrip ); int nBitsPerPixel = stat_GetBPP(); static WORD horzHatchBits[8] = { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00 }; static WORD vertHatchBits[8] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA }; if( _pgd.m_bHorz ) { CBrush brGripperHorz; CBitmap bmpGripperHorz; if( nBitsPerPixel <= 8 ) bmpGripperHorz.CreateBitmap( 8, 8, 1, 1, horzHatchBits ); else { CDC mdc; VERIFY( mdc.CreateCompatibleDC( &dc ) ); VERIFY( bmpGripperHorz.CreateCompatibleBitmap( &dc, 8, 8 ) ); CBitmap * pOldBmp = mdc.SelectObject( &bmpGripperHorz ); mdc.FillSolidRect( 0, 0, 8, 8, clrGrip ); COLORREF clr1 = GetColor( COLOR_3DFACE ); COLORREF clr2 = GetColor( COLOR_3DSHADOW ); COLORREF clrGripLines = RGB( (GetRValue(clr1)*2+GetRValue(clr2))/3, (GetGValue(clr1)*2+GetGValue(clr2))/3, (GetBValue(clr1)*2+GetBValue(clr2))/3 ); CPen pen( PS_SOLID, 1, mdc.GetNearestColor(clrGripLines) ); CPen * pOldPen = mdc.SelectObject( &pen ); for( INT nPos = 0; nPos < 8; nPos += 2 ) { mdc.MoveTo( 0, nPos ); mdc.LineTo( 8, nPos ); } mdc.SelectObject( pOldPen ); mdc.SelectObject( pOldBmp ); } // else from if( nBitsPerPixel < 8 ) brGripperHorz.CreatePatternBrush( &bmpGripperHorz ); rectGripper2.DeflateRect( 5, 2 ); rectGripper2.right = rectGripper2.left + 5; rectGripper2.DeflateRect( 1, 0 ); COLORREF clrOldBk = dc.SetBkColor( GetColor(XPCLR_3DFACE_NORMAL) ); CBrush * pBrushOld = dc.SelectObject( &brGripperHorz ); dc.PatBlt( rectGripper2.left, rectGripper2.top, rectGripper2.Width(), rectGripper2.Height(), 0xA000C9 ); dc.SelectObject( pBrushOld ); dc.SetBkColor( clrOldBk ); } // if( _pgd.m_bHorz ) else { CBrush brGripperVert; CBitmap bmpGripperVert; if( nBitsPerPixel <= 8 ) bmpGripperVert.CreateBitmap( 8, 8, 1, 1, vertHatchBits ); else { CDC mdc; VERIFY( mdc.CreateCompatibleDC( &dc ) ); VERIFY( bmpGripperVert.CreateCompatibleBitmap( &dc, 8, 8 ) ); CBitmap * pOldBmp = mdc.SelectObject( &bmpGripperVert ); mdc.FillSolidRect( 0, 0, 8, 8, clrGrip ); COLORREF clr1 = GetColor( COLOR_3DFACE ); COLORREF clr2 = GetColor( COLOR_3DSHADOW ); COLORREF clrGripLines = RGB( (GetRValue(clr1)*2+GetRValue(clr2))/3, (GetGValue(clr1)*2+GetGValue(clr2))/3, (GetBValue(clr1)*2+GetBValue(clr2))/3 ); CPen pen( PS_SOLID, 1, mdc.GetNearestColor(clrGripLines) ); CPen * pOldPen = mdc.SelectObject( &pen ); for( INT nPos = 0; nPos < 8; nPos += 2 ) { mdc.MoveTo( nPos, 0 ); mdc.LineTo( nPos, 8 ); } mdc.SelectObject( pOldPen ); mdc.SelectObject( pOldBmp ); } // else from if( nBitsPerPixel < 8 ) brGripperVert.CreatePatternBrush( &bmpGripperVert ); rectGripper2.OffsetRect( 1, 0 ); rectGripper2.DeflateRect( 2, 5 ); rectGripper2.bottom = rectGripper2.top + 5; rectGripper2.DeflateRect( 0, 1 ); COLORREF clrOldBk = dc.SetBkColor( GetColor(XPCLR_3DFACE_NORMAL) ); CBrush * pBrushOld = dc.SelectObject( &brGripperVert ); dc.PatBlt( rectGripper2.left, rectGripper2.top, rectGripper2.Width(), rectGripper2.Height(), 0xA000C9 ); dc.SelectObject( pBrushOld ); dc.SetBkColor( clrOldBk ); } // else from if( _pgd.m_bHorz ) } // else from if( _pgd.m_bSideBar || _pgd.m_bFloating ) } void CExtPaintManagerOffice2003::PaintGripper( CDC & dc, CExtPaintManager::PAINTGRIPPERDATA & _pgd ) { bool bStyleOffice2003 = true; if( _pgd.m_bFloating //|| _pgd.m_bSideBar || _pgd.m_pHelperSrc == NULL || (!( _pgd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtControlBar)) #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS) || _pgd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynAutoHideSlider)) #endif )) || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) bStyleOffice2003 = false; CWnd * pBar = NULL; bool bForceNoBaloon = false; bool bInactiveResizableBarCapt = false; #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS) if( bStyleOffice2003 && _pgd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynAutoHideSlider)) ) { // auto-hide slider pBar = STATIC_DOWNCAST( CWnd, _pgd.m_pHelperSrc ); bInactiveResizableBarCapt = true; } // auto-hide slider else #endif if( bStyleOffice2003 ) { // non-dockers pBar = STATIC_DOWNCAST( CWnd, _pgd.m_pHelperSrc ); ASSERT_VALID( pBar ); if( _pgd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) ) { // if panel bar bForceNoBaloon = true; } // if panel bar if( _pgd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) ) { // if control bar if( ((CExtControlBar*)pBar)->m_pDockSite != NULL ) { // if docked if( ((CExtControlBar*)pBar)->IsFloating() ) bStyleOffice2003 = false; } // if docked else { // if simple bForceNoBaloon = true; } // if simple } // if control bar else { // if NOT control bar bStyleOffice2003 = false; } // if NOT control bar } // non-dockers if( !bStyleOffice2003 ) { CExtPaintManagerXP::PaintGripper( dc, _pgd ); return; } // if( !bStyleOffice2003 ) ASSERT_VALID( pBar ); CRect rcBarWnd, rcBarClient; pBar->GetWindowRect( &rcBarWnd ); pBar->GetClientRect( &rcBarClient ); pBar->ClientToScreen( &rcBarClient ); if( _pgd.m_bSideBar || bInactiveResizableBarCapt ) { // if resizable bar caption _pgd.m_bHelperNoFill = _pgd.m_bHelperNoRect = !_pgd.m_bActive; if( _pgd.m_bSideBar ) bInactiveResizableBarCapt = !_pgd.m_bActive; if( bInactiveResizableBarCapt ) { CRect rcHelper( rcBarClient ); rcHelper.OffsetRect( -rcBarWnd.TopLeft() ); CRect rcGripper( _pgd.m_rcGripper ); rcGripper.bottom = rcHelper.top + 4; stat_PaintGradientRect( dc, rcGripper, GetColor( _2003CLR_GRADIENT_LIGHT ), GetColor( _2003CLR_GRADIENT_DARK ) ); } // if( bInactiveResizableBarCapt ) CExtPaintManagerXP::PaintGripper( dc, _pgd ); return; } // if resizable bar caption if( (! pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) && (!bForceNoBaloon) ) { // if toolbar balloon style CDC & dcCompat = CachedDcGet( _pgd.m_bHorz ? m_bmpCtBarGradientHorz : m_bmpCtBarGradientVert ); if( dcCompat.GetSafeHdc() == NULL ) { ASSERT( FALSE ); return; } CRect rcPaintGradient( rcBarWnd ); if( _pgd.m_bHorz ) { rcPaintGradient.top = rcBarClient.top; rcPaintGradient.bottom = rcBarClient.bottom; // + 1; rcPaintGradient.right = rcBarClient.right; rcPaintGradient.OffsetRect( -rcPaintGradient.left, -rcPaintGradient.top + rcBarClient.top - rcBarWnd.top ); } // if( _pgd.m_bHorz ) else { rcPaintGradient.left = rcBarClient.left; rcPaintGradient.right = rcBarClient.right; // + 1; rcPaintGradient.bottom = rcBarClient.bottom; rcPaintGradient.OffsetRect( -rcPaintGradient.left + rcBarClient.left - rcBarWnd.left, -rcPaintGradient.top ); } // else from if( _pgd.m_bHorz ) int nIdxClrTbFillMargin = -1; CRgn _rgnBaloonSet; if( m_sizeToolBarRgnRounders.cx > 0 && m_sizeToolBarRgnRounders.cy > 0 ) { // if baloon style nIdxClrTbFillMargin = m_nIdxClrTbFillMargin; if( _rgnBaloonSet.CreateRoundRectRgn( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy ) ) { dc.SelectClipRgn( &_rgnBaloonSet ); } #ifdef _DEBUG else { ASSERT( FALSE ); } #endif // _DEBUG } // if baloon style CSize sizeShade = _pgd.m_bHorz ? m_sizeCtBarGradientHorz : m_sizeCtBarGradientVert ; int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( rcPaintGradient.left, rcPaintGradient.top, rcPaintGradient.Width(), rcPaintGradient.Height(), &dcCompat, 0, 0, sizeShade.cx, sizeShade.cy, SRCCOPY ); if( nIdxClrTbFillMargin >= 0 ) { CPen _pen( PS_SOLID, 1, GetColor(m_nIdxClrTbFillMargin) ); CPen * pOldPen = dc.SelectObject( &_pen ); if( _pgd.m_bHorz ) { dc.MoveTo( rcPaintGradient.left, rcPaintGradient.bottom-2 ); dc.LineTo( rcPaintGradient.right, rcPaintGradient.bottom-2 ); } // if( _pgd.m_bHorz ) else { dc.MoveTo( rcPaintGradient.right-2, rcPaintGradient.top ); dc.LineTo( rcPaintGradient.right-2, rcPaintGradient.bottom ); } // else from if( _pgd.m_bHorz ) dc.SelectObject( pOldPen ); } // if( nIdxClrTbFillMargin >= 0 ) dc.SetStretchBltMode( nOldStretchBltMode ); if( _rgnBaloonSet.GetSafeHandle() != NULL ) dc.SelectClipRgn( NULL ); } // if toolbar balloon style COLORREF clrDotShadow = GetColor( _2003CLR_GRIPPER_DOT_LIGHT ); COLORREF clrDotFace = GetColor( _2003CLR_GRIPPER_DOT_DARK ); static const CSize g_sizeGripDot( 2, 2 ); static const CSize g_sizeGripDist( 1, 1 ); static const CSize g_sizeGripShadowOffset( 1, 1 ); CRect rcGripHelper( _pgd.m_rcGripper ); CRect rcBarClientW( rcBarClient ); rcBarClientW.OffsetRect( -rcBarWnd.TopLeft() ); if( _pgd.m_bHorz ) { rcGripHelper.top = rcBarClientW.top; rcGripHelper.bottom = rcBarClientW.bottom; rcGripHelper.OffsetRect( 1, 0 ); rcGripHelper.left += (rcGripHelper.Width() - g_sizeGripDot.cx) / 2; rcGripHelper.right = rcGripHelper.left + g_sizeGripDot.cx; rcGripHelper.DeflateRect( 0, g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy ); int nDotCount = rcGripHelper.Height() / (g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy); rcGripHelper.top += rcGripHelper.Height() - (g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy) * nDotCount; CRect rcDotFace( rcGripHelper ); rcDotFace.bottom = rcDotFace.top + g_sizeGripDot.cy; CRect rcDotShadow( rcDotFace ); rcDotShadow.OffsetRect( g_sizeGripShadowOffset ); for( int nDot = 0; nDot < nDotCount; nDot++ ) { dc.FillSolidRect( &rcDotShadow, clrDotShadow ); dc.FillSolidRect( &rcDotFace, clrDotFace ); rcDotFace.OffsetRect( 0, g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy ); rcDotShadow.OffsetRect( 0, g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy ); } // for( int nDot = 0; nDot < nDotCount; nDot++ ) } // if( _pgd.m_bHorz ) else { rcGripHelper.left = rcBarClientW.left; rcGripHelper.right = rcBarClientW.right; rcGripHelper.OffsetRect( 0, 1 ); rcGripHelper.top += (rcGripHelper.Height() - g_sizeGripDot.cy) / 2; rcGripHelper.bottom = rcGripHelper.top + g_sizeGripDot.cy; rcGripHelper.DeflateRect( g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx, 0 ); int nDotCount = rcGripHelper.Width() / (g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx); rcGripHelper.left += rcGripHelper.Width() - (g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx) * nDotCount; CRect rcDotFace( rcGripHelper ); rcDotFace.right = rcDotFace.left + g_sizeGripDot.cx; CRect rcDotShadow( rcDotFace ); rcDotShadow.OffsetRect( g_sizeGripShadowOffset ); for( int nDot = 0; nDot < nDotCount; nDot++ ) { dc.FillSolidRect( &rcDotShadow, clrDotShadow ); dc.FillSolidRect( &rcDotFace, clrDotFace ); rcDotFace.OffsetRect( g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx, 0 ); rcDotShadow.OffsetRect( g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx, 0 ); } // for( int nDot = 0; nDot < nDotCount; nDot++ ) } // else from if( _pgd.m_bHorz ) } CSize CExtPaintManager::GetPushedOffset() { return CSize(1,1); } CSize CExtPaintManagerXP::GetPushedOffset() { return CSize(0,0); } CSize CExtPaintManagerOffice2003::GetPushedOffset() { return CSize(0,0); } #define __XP_DSS_MONO DSS_MONO void CExtPaintManagerXP::InitTranslatedColors() { ASSERT( this != NULL ); m_DSS_DISABLED_style = __XP_DSS_MONO; CExtPaintManager::InitTranslatedColors(); int nBitsPerPixel = CExtPaintManager::stat_GetBPP(); COLORREF clrSysWindow = ::GetSysColor(COLOR_WINDOW); COLORREF clrSys3dFace = ::GetSysColor(COLOR_3DFACE); COLORREF clrSys3dHilight = ::GetSysColor(COLOR_3DHILIGHT); COLORREF clrSys3dShadow = ::GetSysColor(COLOR_3DSHADOW); COLORREF clrSys3dDkShadow = ::GetSysColor(COLOR_3DDKSHADOW); COLORREF clrSysBtnText = ::GetSysColor(COLOR_BTNTEXT); COLORREF clrSysItemHilight = ::GetSysColor(COLOR_HIGHLIGHT); COLORREF xpclr_MenuLight = clrSysWindow; COLORREF xpclr_ControlBarBk = clrSys3dFace; COLORREF xpclr_Highlight = clrSys3dFace; COLORREF xpclr_Separator = clrSys3dShadow; COLORREF xpclr_PanelBorder = clrSys3dShadow; COLORREF xpclr_RarelyUsedMenuLeft = clrSys3dShadow; // clrSys3dFace; COLORREF xpclr_HighlightDarked = clrSys3dShadow; COLORREF xpclr_HighlightBorder = clrSysBtnText; if( nBitsPerPixel > 8 ) { // xp - menu area light ver (like system COLOR_WINDOW but more brown) xpclr_MenuLight = stat_HLS_Adjust( clrSys3dFace, 0.00, 0.70, -0.50 ); xpclr_MenuLight = RGB( GetRValue(xpclr_MenuLight) + ::MulDiv( 255 - GetRValue(xpclr_MenuLight), 40, 100 ), GetGValue(xpclr_MenuLight) + ::MulDiv( 255 - GetGValue(xpclr_MenuLight), 20, 100 ), GetBValue(xpclr_MenuLight) ); xpclr_MenuLight = stat_HLS_Adjust( xpclr_MenuLight, 0.00, 0.06, 0.05 ); // xp - rarely used item left side xpclr_RarelyUsedMenuLeft = RGB( ( 999L*long(GetRValue(clrSys3dFace)) ) / 1000L, ( 995L*long(GetGValue(clrSys3dFace)) ) / 1000L, ( 995L*long(GetBValue(clrSys3dFace)) ) / 1000L ); // xp - control bar funny background xpclr_ControlBarBk = stat_HLS_Adjust( xpclr_ControlBarBk, 0.00, 0.20, 0.00 ); // xp - blue like light ver xpclr_Highlight = stat_HLS_Adjust( clrSysItemHilight, 0.00, 0.75, -0.75 ); // xp - blue like dark ver xpclr_HighlightDarked = stat_HLS_Adjust( xpclr_Highlight, 0.00, -0.25, 0.10 ); // xp - blue dark selected border xpclr_HighlightBorder = stat_HLS_Adjust( xpclr_HighlightDarked, 0.00, -0.50, 0.00 ); // xp - dark gray separator xpclr_Separator = RGB( ( 857L*long(GetRValue(clrSys3dFace)) ) / 1000L, ( 857L*long(GetGValue(clrSys3dFace)) ) / 1000L, ( 857L*long(GetBValue(clrSys3dFace)) ) / 1000L ); // xp - dark panel border (for floating controlbars) xpclr_PanelBorder = RGB( ( 750L*long(GetRValue(clrSys3dShadow)) + 250L*long(GetRValue(clrSys3dDkShadow)) ) / 1000L, ( 750L*long(GetGValue(clrSys3dShadow)) + 250L*long(GetGValue(clrSys3dDkShadow)) ) / 1000L, ( 750L*long(GetBValue(clrSys3dShadow)) + 250L*long(GetBValue(clrSys3dDkShadow)) ) / 1000L ); } // if( nBitsPerPixel > 8 ) m_mapColorTranslate[CLR_3DFACE_OUT] = InstallColor( xpclr_ControlBarBk ); m_mapColorTranslate[CLR_3DFACE_IN] = InstallColor( xpclr_Highlight ); m_mapColorTranslate[CLR_3DFACE_DISABLED] = COLOR_3DFACE; int idxClrDark = InstallColor( xpclr_PanelBorder ); m_mapColorTranslate[CLR_3DLIGHT_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DLIGHT_IN] = idxClrDark; m_mapColorTranslate[CLR_3DLIGHT_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_IN] = idxClrDark; m_mapColorTranslate[CLR_3DHILIGHT_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_IN] = idxClrDark; m_mapColorTranslate[CLR_3DSHADOW_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_OUT] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_IN] = idxClrDark; m_mapColorTranslate[CLR_3DDKSHADOW_DISABLED] = idxClrDark; m_mapColorTranslate[CLR_TEXT_OUT] = COLOR_BTNTEXT; m_mapColorTranslate[CLR_TEXT_IN] = InstallColor( (nBitsPerPixel > 8) ? RGB(0,0,0) : clrSys3dHilight ); m_mapColorTranslate[CLR_TEXT_DISABLED] = COLOR_3DSHADOW; m_mapColorTranslate[XPCLR_PUSHEDHOVERTEXT] = COLOR_HIGHLIGHTTEXT; m_mapColorTranslate[XPCLR_3DFACE_DARK] = InstallColor( xpclr_ControlBarBk ); m_mapColorTranslate[XPCLR_3DFACE_NORMAL] = InstallColor( xpclr_MenuLight ); m_mapColorTranslate[XPCLR_SEPARATOR] = InstallColor( xpclr_Separator ); m_mapColorTranslate[XPCLR_HILIGHT] = InstallColor( xpclr_HighlightDarked ); m_mapColorTranslate[XPCLR_HILIGHT_BORDER] = InstallColor( xpclr_HighlightBorder ); m_mapColorTranslate[XPCLR_RARELY_BORDER] = InstallColor( xpclr_RarelyUsedMenuLeft ); m_mapColorTranslate[XPCLR_MENU_BORDER] = COLOR_3DDKSHADOW; m_mapColorTranslate[XPCLR_3DFACE_FLOAT_R] = InstallColor( xpclr_MenuLight ); m_mapColorTranslate[XPCLR_3DFACE_FLOAT_F] = InstallColor( GetColor(CLR_3DFACE_OUT) ); } void CExtPaintManagerXP::PaintPushButton( CDC & dc, CExtPaintManager::PAINTPUSHBUTTONDATA & _ppbd ) { if( _ppbd.m_rcClient.IsRectEmpty() ) return; if( !_ppbd.m_bEnabled ) { _ppbd.m_bHover = false; //_ppbd.m_bDrawBorder = false; _ppbd.m_bDrawFocusRect = false; _ppbd.m_bIndeterminate = false; } COLORREF clrOldText = dc.GetTextColor(); COLORREF clrOldBk = dc.GetBkColor(); int nOldBkMode = dc.SetBkMode( TRANSPARENT ); int nIdxMainGradientLeft = -1; int nIdxMainGradientRight = -1; // Prepare draw... paint button's area with background color COLORREF bgColor, bgColorDD; if( _ppbd.m_bHover || _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) { bgColor = bgColorDD = GetColor( CLR_3DFACE_IN ); if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) { (( _ppbd.m_bPushedDropDown ) ? bgColorDD : bgColor) = GetColor( _ppbd.m_bHover ? XPCLR_HILIGHT : CLR_3DFACE_IN); } // if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) if( (!_ppbd.m_bHover) && _ppbd.m_bPushed && (!_ppbd.m_bPushedDropDown) && _ppbd.m_bSeparatedDropDown ) bgColorDD = GetColor( CLR_3DFACE_OUT ); if( _ppbd.m_bHover ) { if( _ppbd.m_bPushed ) { nIdxMainGradientLeft = m_nIdxClrBtnHovPresLeft; nIdxMainGradientRight = m_nIdxClrBtnHovPresRight; } // if( _ppbd.m_bPushed ) else { nIdxMainGradientLeft = m_nIdxClrBtnHoverLeft; nIdxMainGradientRight = m_nIdxClrBtnHoverRight; } // else from if( _ppbd.m_bPushed ) } // if( _ppbd.m_bHover ) else if( _ppbd.m_bPushed ) { nIdxMainGradientLeft = m_nIdxClrBtnPressedLeft; nIdxMainGradientRight = m_nIdxClrBtnPressedRight; } // else if( _ppbd.m_bPushed ) } // if( _ppbd.m_bHover || _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) else { bgColor = bgColorDD = GetColor( _ppbd.m_bFlat ? CLR_3DFACE_OUT : COLOR_3DFACE ); } COLORREF clrDkBorder = GetColor( (_ppbd.m_bHover || _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) ? XPCLR_HILIGHT_BORDER : ( _ppbd.m_bFlat ? XPCLR_HILIGHT_BORDER : COLOR_3DDKSHADOW ) ); bool bPushedDropDown = false; if( (_ppbd.m_bPushed && !_ppbd.m_bSeparatedDropDown) || _ppbd.m_bPushedDropDown ) bPushedDropDown = true; CRect rectClient( _ppbd.m_rcClient ); CRect rectTotal( _ppbd.m_rcClient ); CRect rectCaption( _ppbd.m_rcClient ); CRect rectDropDown( 0,0,0,0 ); if( _ppbd.m_bDropDown ) { rectDropDown = rectClient; if( _ppbd.m_bHorz ) { rectCaption.right -= __DROPDOWN_ARROW_GAP*2 + g_glyph_btn_expand_bottom.Size().cx ; rectDropDown.left = rectCaption.right - 1; } // if( _ppbd.m_bHorz ) else { rectCaption.bottom -= __DROPDOWN_ARROW_GAP*2 + g_glyph_btn_expand_right.Size().cy ; rectDropDown.top = rectCaption.bottom - 1; } // if( _ppbd.m_bHorz ) if( !_ppbd.m_bTransparentBackground ) { CBrush br( bgColorDD ); dc.FillRect( &rectDropDown, &br ); } // if( !_ppbd.m_bTransparentBackground ) if( _ppbd.m_bSeparatedDropDown ) { rectClient = rectCaption; if( bPushedDropDown ) { if( _ppbd.m_bFlat ) { if( _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder ); } // if( _ppbd.m_bFlat ) else dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder ); } // if( bPushedDropDown ) else { if( _ppbd.m_bFlat ) { if( _ppbd.m_bHover && _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder ); } // if( _ppbd.m_bFlat ) else dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder ); } // else from if( bPushedDropDown ) } // if( _ppbd.m_bSeparatedDropDown ) } // if( _ppbd.m_bDropDown ) if( !_ppbd.m_bTransparentBackground ) { if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) { stat_PaintGradientRect( dc, rectClient, GetColor( _ppbd.m_bHorz ? nIdxMainGradientRight : nIdxMainGradientLeft ), GetColor( _ppbd.m_bHorz ? nIdxMainGradientLeft : nIdxMainGradientRight ), _ppbd.m_bHorz ); } // if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) else { CBrush br( bgColor ); dc.FillRect( &rectClient, &br ); } // else from if( nIdxMainGradientLeft >= 0 && nIdxMainGradientRight >= 0 ) } // if( !_ppbd.m_bTransparentBackground ) // Draw pressed button if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) { if( _ppbd.m_bFlat ) { if( _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder ); } else dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder ); } // if( bPushed ) else // ...else draw non pressed button { if( _ppbd.m_bFlat ) { if( _ppbd.m_bHover && _ppbd.m_bDrawBorder ) dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder ); } // if( _ppbd.m_bFlat ) else { dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder ); if( _ppbd.m_bHover ) dc.Draw3dRect( rectTotal, clrDkBorder, clrDkBorder ); } // else from if( _ppbd.m_bFlat ) } // else from if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) if( _ppbd.m_bDropDown ) { CRect rectGlyph( rectDropDown ); if( bPushedDropDown ) rectGlyph.OffsetRect( GetPushedOffset() ); COLORREF ColorValues[2] = { RGB(0,0,0), GetColor( // _ppbd.m_bEnabled // ? (_ppbd.m_bHover || /*_ppbd.m_bPushed ||*/ _ppbd.m_bPushedDropDown) // ? ((_ppbd.m_bHover && (/*_ppbd.m_bPushed ||*/ _ppbd.m_bPushedDropDown)) ? COLOR_HIGHLIGHTTEXT : CLR_TEXT_IN ) // : ( _ppbd.m_bFlat ? CLR_TEXT_OUT : COLOR_BTNTEXT ) // : CLR_3DSHADOW_OUT _ppbd.m_bEnabled ? (_ppbd.m_bHover || _ppbd.m_bPushedDropDown) ? ( ( _ppbd.m_clrForceTextPressed == ((COLORREF)-1L) ) ? ( (_ppbd.m_bHover && _ppbd.m_bPushedDropDown) ? COLOR_HIGHLIGHTTEXT : CLR_TEXT_IN ) : _ppbd.m_clrForceTextPressed ) : ( ( _ppbd.m_clrForceTextNormal == ((COLORREF)-1L) ) ? ( _ppbd.m_bFlat ? CLR_TEXT_OUT : COLOR_BTNTEXT ) : _ppbd.m_clrForceTextNormal ) : ( ( _ppbd.m_clrForceTextDisabled == ((COLORREF)-1L) ) ? CLR_3DSHADOW_OUT : _ppbd.m_clrForceTextDisabled ) ) }; PaintGlyphCentered( dc, rectGlyph, _ppbd.m_bHorz ? g_glyph_btn_expand_bottom : g_glyph_btn_expand_right, ColorValues ); } // if( _ppbd.m_bDropDown ) rectClient = rectCaption; CExtSafeString sTitle( _T("") ); if( _ppbd.m_sText != NULL ) sTitle = _ppbd.m_sText; // Draw the icon if( rectClient.bottom > rectClient.top && rectClient.right > rectClient.left ) { if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) { PaintIcon( dc, _ppbd.m_bHorz, sTitle, _ppbd.m_pIcon, rectClient, rectCaption, _ppbd.m_bPushed || _ppbd.m_bPushedDropDown, _ppbd.m_bEnabled, _ppbd.m_bHover, _ppbd.m_eAlign ); } // if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) else { PaintSysCmdGlyph( dc, _ppbd.m_nHelperSysCmdID, rectClient, false, _ppbd.m_bPushed || _ppbd.m_bPushedDropDown, _ppbd.m_bEnabled ); } // else from if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) ) } if( rectCaption.bottom > rectCaption.top && rectCaption.right > rectCaption.left ) { // if we have valid area for text & focus rect if( !sTitle.IsEmpty() ) { if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown ) { CSize sizePushedOffset = GetPushedOffset(); rectCaption.OffsetRect(sizePushedOffset); } dc.SetBkColor( bgColor ); dc.SetBkMode( TRANSPARENT ); if( _ppbd.m_bEnabled ) { int nColorIdx = (_ppbd.m_bHover || _ppbd.m_bPushed ) ? ( (_ppbd.m_bHover && _ppbd.m_bPushed) ? XPCLR_PUSHEDHOVERTEXT : CLR_TEXT_IN ) : ( _ppbd.m_bFlat ? CLR_TEXT_OUT : COLOR_BTNTEXT ) ; if( nColorIdx == XPCLR_PUSHEDHOVERTEXT && _ppbd.m_clrForceTextPressed != ((COLORREF)-1L) ) dc.SetTextColor( _ppbd.m_clrForceTextPressed ); else if( nColorIdx == CLR_TEXT_IN && _ppbd.m_clrForceTextHover != ((COLORREF)-1L) ) dc.SetTextColor( _ppbd.m_clrForceTextHover ); else if( ( ! (_ppbd.m_bHover || _ppbd.m_bPushed ) ) && _ppbd.m_clrForceTextNormal != ((COLORREF)-1L) ) dc.SetTextColor( _ppbd.m_clrForceTextNormal ); else dc.SetTextColor( GetColor( nColorIdx ) ); } // if( _ppbd.m_bEnabled ) else { if( _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) ) dc.SetTextColor( _ppbd.m_clrForceTextDisabled ); else dc.SetTextColor( GetColor( COLOR_3DSHADOW ) ); } // else from if( _ppbd.m_bEnabled ) // // center text // CRect centerRect = rectCaption; CFont * pOldBtnFont = NULL; CFont * pCurrFont = NULL; CFont fontDummy; if( _ppbd.m_hFont != NULL ) { if( _ppbd.m_bHorz ) pCurrFont = CFont::FromHandle( _ppbd.m_hFont ); else { LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); ::GetObject( _ppbd.m_hFont, sizeof(LOGFONT), &lf ); if( lf.lfEscapement == 0 ) { lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT__; VERIFY( fontDummy.CreateFontIndirect(&lf) ); pCurrFont = &fontDummy; } else { // suppose font already prepared pCurrFont = CFont::FromHandle( _ppbd.m_hFont ); } } } // if( _ppbd.m_hFont != NULL ) else { if( _ppbd.m_bHorz ) { if( _ppbd.m_bDefaultPushButton ) pCurrFont = &m_FontBold; else pCurrFont = &m_FontNormal; } else { if( _ppbd.m_bDefaultPushButton ) pCurrFont = &m_FontBoldVert; else pCurrFont = &m_FontNormalVert; } } // else from if( _ppbd.m_hFont != NULL ) ASSERT( pCurrFont != NULL ); pOldBtnFont = dc.SelectObject( pCurrFont ); ASSERT( pOldBtnFont != NULL ); int nTextLength = sTitle.GetLength(); int nAmpIndex = sTitle.Find( _T('&') ); CExtSafeString sBtn; if( nAmpIndex < 0 ) sBtn = sTitle; else sBtn = sTitle.Left( nAmpIndex ) + sTitle.Right( nTextLength - (nAmpIndex+1) ) ; ASSERT( sBtn.Find( _T('&') ) < 0 ); CRect rcText(0,0,0,0); dc.DrawText( sBtn, -1, rcText, DT_SINGLELINE|DT_CALCRECT ); CRect rcCenteredCaption(rectCaption); rcCenteredCaption.OffsetRect( (rectCaption.Width() - rcText.Width())/2, (rectCaption.Height() - rcText.Height())/2 ); if( _ppbd.m_bHorz ) { dc.DrawText( sTitle, -1, rectCaption, _ppbd.m_nDrawTextFlagsH ); } else { LOGFONT lf; ::memset(&lf,0,sizeof(LOGFONT)); pCurrFont->GetLogFont(&lf); int _cyHorzFont = abs(lf.lfHeight); int _cyTextMargin = (rectCaption.Width() - _cyHorzFont) / 2 ; CPoint ptLineFrom(0,0), ptLineTo(0,0); if( nAmpIndex >= 0 ) { ptLineFrom = CPoint( __ExtMfc_CXTEXTMARGIN + _cyTextMargin, __ExtMfc_CYTEXTMARGIN + stat_CalcTextWidth( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn.Left(nAmpIndex) ) ); ptLineTo = CPoint( __ExtMfc_CXTEXTMARGIN + _cyTextMargin, __ExtMfc_CYTEXTMARGIN + stat_CalcTextWidth( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn.Left(nAmpIndex+1) ) ); int nXOffsPlus = rectCaption.Width() - stat_CalcTextDimension( dc, _ppbd.m_bDefaultPushButton ? m_FontBold : m_FontNormal, sBtn ).Height(); nXOffsPlus /= 2; nXOffsPlus -= 4; ptLineFrom.x += nXOffsPlus; ptLineTo.x += nXOffsPlus; } // if( nAmpIndex >= 0 ) CRect rcString = CRect( CPoint( rectCaption.right - _cyTextMargin + __ExtMfc_CXTEXTMARGIN, rectCaption.top + __ExtMfc_CYTEXTMARGIN ), rectCaption.Size() //m_sizeHorz ); rcString.DeflateRect(2,2); CSize ptFix(-rcString.Width()-1,0); ptLineFrom += rcString.TopLeft() + ptFix; ptLineTo += rcString.TopLeft() + ptFix; if( _ppbd.m_bEnabled ) { /*VTX*/ dc.DrawText( sBtn, sBtn.GetLength(), rcString, DT_SINGLELINE|DT_NOCLIP|DT_NOPREFIX ); if( nAmpIndex >= 0 ) { CPen pen( PS_SOLID, 0, dc.GetTextColor() ); CPen * pOldPen = dc.SelectObject( &pen ); dc.MoveTo( ptLineFrom ); dc.LineTo( ptLineTo ); dc.SelectObject( pOldPen ); } // if( nAmpIndex >= 0 ) } // if( _ppbd.m_bEnabled ) else { // CPoint ptOffsetPre(1,1); // CPoint ptOffsetPost(-1,-1); // COLORREF clrText = GetColor(COLOR_3DSHADOW); // COLORREF clrShadow = GetColor(COLOR_3DHILIGHT); // rcString.OffsetRect(ptOffsetPre.x,ptOffsetPre.y); // dc.SetTextColor( clrShadow ); dc.DrawText( sBtn, sBtn.GetLength(), rcString, DT_SINGLELINE //|DT_CENTER|DT_VCENTER |DT_NOCLIP|DT_NOPREFIX ); // don't forget DT_NOCLIP // rcString.OffsetRect(ptOffsetPost.x,ptOffsetPost.y); // dc.SetTextColor( clrText ); // dc.DrawText( // sBtn, // rcString, // DT_SINGLELINE //|DT_CENTER|DT_VCENTER // |DT_NOCLIP|DT_NOPREFIX // ); // don't forget DT_NOCLIP if( nAmpIndex >= 0 ) { CPen pen( PS_SOLID, 0, dc.GetTextColor() // clrShadow ); CPen * pOldPen = dc.SelectObject( &pen ); // ptLineFrom += ptOffsetPre; // ptLineTo += ptOffsetPre; dc.MoveTo( ptLineFrom ); dc.LineTo( ptLineTo ); // pen.DeleteObject(); // pen.CreatePen( // PS_SOLID, // 0, // clrText // ); // dc.SelectObject( &pen ); // ptLineFrom += ptOffsetPost; // ptLineTo += ptOffsetPost; // dc.MoveTo( ptLineFrom ); // dc.LineTo( ptLineTo ); dc.SelectObject( pOldPen ); } // if( nAmpIndex >= 0 ) } // else from if( _ppbd.m_bEnabled ) } dc.SelectObject(pOldBtnFont); } // if( !sTitle.IsEmpty() ) if( _ppbd.m_bDrawFocusRect ) { CRect focusRect = rectCaption; // rectClient focusRect.DeflateRect( 3, 3 ); dc.DrawFocusRect(&focusRect); } // if( _ppbd.m_bDrawFocusRect ) } // if we have valid area for text & focus rect dc.SetBkMode( nOldBkMode ); dc.SetBkColor( clrOldBk ); dc.SetTextColor( clrOldText ); } void CExtPaintManagerXP::PaintIcon( CDC & dc, bool bHorz, CExtSafeString & sTitle, CExtCmdIcon * pIcon, const CRect & rectItem, CRect & rectCaption, bool bPushed, bool bEnabled, bool bHover, int eAlign ) { rectCaption = rectItem; if( pIcon == NULL || pIcon->IsEmpty() ) return; CSize _sizeIcon = pIcon->GetSize(); ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 ); CRect iconRect = rectItem; CRect btnRect; if( bHorz ) { if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) { if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); else { iconRect.left += 3; rectCaption.left += _sizeIcon.cx + 3; } } // if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) else { if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) { btnRect = rectCaption; if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); else { rectCaption.right = rectCaption.Width() - _sizeIcon.cx - 3; rectCaption.left = 3; iconRect.left = btnRect.right - _sizeIcon.cx - 3; // Center the icon vertically iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); } } // if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) } // else from if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) if( (eAlign&__ALIGN_VERT) != 0 ) { // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); } // if( (eAlign&__ALIGN_VERT) != 0 ) } // if( bHorz ) else { if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) { if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); else { iconRect.top += 3; rectCaption.top += _sizeIcon.cy + 3; } } // if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) else { if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) { btnRect = rectCaption; if( sTitle.IsEmpty() ) // Center the icon horizontally iconRect.top += ((iconRect.Height() - _sizeIcon.cy)/2); else { rectCaption.top = rectCaption.Height() - _sizeIcon.cy - 3; rectCaption.top = 3; iconRect.top = btnRect.top - _sizeIcon.cy - 3; // Center the icon vertically iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); } } // if( (eAlign&__ALIGN_HORIZ_RIGHT) != 0 ) } // else from if( (eAlign&__ALIGN_HORIZ_CENTER) != 0 ) if( (eAlign&__ALIGN_VERT) != 0 ) { // Center the icon horizontally iconRect.left += ((iconRect.Width() - _sizeIcon.cx)/2); } // if( (eAlign&__ALIGN_VERT) != 0 ) } // else from if( bHorz ) // If button is pressed then press the icon also if( bPushed ) { CSize sizePushedOffset = GetPushedOffset(); iconRect.OffsetRect(sizePushedOffset.cx, sizePushedOffset.cy); } CPoint ptTopLeft = iconRect.TopLeft(); if( m_bEnabledHoverIconShadows ) ptTopLeft += CSize(1,1); if( bEnabled ) { CPoint ptOffs( 0, 0 ); if( m_bEnabledHoverIconShadows && bHover && (!bPushed) ) { CBrush brBack; if( !brBack.CreateSolidBrush( GetColor( COLOR_3DSHADOW ) ) ) { ASSERT(FALSE); return; } // if( !brBack.CreateSolidBrush( GetColor( COLOR_3DSHADOW ) ) ) // dc.DrawState( // ptTopLeft + ptOffs, // iconRect.Size(), // pIcon->GetIcon(), // __XP_DSS_MONO, // &brBack // ); pIcon->Paint( dc, ptTopLeft + ptOffs, CExtCmdIcon::__DRAW_MONO, (HBRUSH)brBack.GetSafeHandle() ); ptOffs.x = ptOffs.y = -2; } // if( m_bEnabledHoverIconShadows && bHover && (!bPushed) ) // dc.DrawState( // ptTopLeft + ptOffs, // iconRect.Size(), // pIcon->GetIcon(), // DSS_NORMAL, // (CBrush*)NULL // ); pIcon->Paint( dc, ptTopLeft + ptOffs, CExtCmdIcon::__DRAW_NORMAL ); } // DSS_NORMAL else { CBrush brDisabled; if( !brDisabled.CreateSolidBrush(GetColor(XPCLR_SEPARATOR)) ) { ASSERT(FALSE); return; } // dc.DrawState( // ptTopLeft, // iconRect.Size(), // pIcon->GetIcon(), // __XP_DSS_MONO, // &brDisabled // ); COLORREF clrAlpha = GetIconAlphaColor(); if( clrAlpha != (COLORREF(-1L)) ) { if( clrAlpha != pIcon->AlphaColorGet() ) pIcon->AlphaColorSet( clrAlpha ); double lfAlphaAdjustPercent = GetIconAlphaAdjustPercent(); if( lfAlphaAdjustPercent != pIcon->AlphaAdjustPercentGet() ) pIcon->AlphaAdjustPercentSet( lfAlphaAdjustPercent ); } // if( clrAlpha != (COLORREF(-1L)) ) pIcon->Paint( dc, iconRect.TopLeft(), ( clrAlpha == (COLORREF(-1L)) ) ? CExtCmdIcon::__DRAW_MONO : CExtCmdIcon::__DRAW_ALPHA, (HBRUSH)brDisabled.GetSafeHandle() ); } // DSS_NORMAL } void CExtPaintManagerXP::PaintComboFrame( CDC &dc, CExtPaintManager::PAINTCOMBOFRAMEDATA & _pcfd ) { CRect rectClient2( _pcfd.m_rcClient ); int nSavedDC = dc.SaveDC(); COLORREF clrWindow = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? GetColor( _pcfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) : _pcfd.m_clrForceNABorder ; COLORREF clrFaceOut = ( _pcfd.m_clrForceNAContent == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? GetColor( CLR_3DFACE_OUT ) : _pcfd.m_clrForceNAContent ; COLORREF clrHilight = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? GetColor( XPCLR_3DFACE_NORMAL ) : _pcfd.m_clrForceNABorder ; COLORREF clrShadow = ( _pcfd.m_clrForceNABorder == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? GetColor( CLR_3DFACE_OUT ) : _pcfd.m_clrForceNABorder ; CRect rectClient( _pcfd.m_rcClient ); COLORREF clrOuterBorder = (_pcfd.m_clrForceActiveOuterBorder != COLORREF(-1L) && (_pcfd.m_bHover || _pcfd.m_bPushed) ) ? _pcfd.m_clrForceActiveOuterBorder : clrFaceOut ; if( !_pcfd.m_bNoTopOuterBorder ) dc.Draw3dRect( rectClient, clrOuterBorder, clrOuterBorder ); rectClient.DeflateRect(1,1); dc.Draw3dRect( rectClient, clrHilight, clrHilight ); rectClient.left = rectClient.right - ::GetSystemMetrics(SM_CXHTHUMB); dc.Draw3dRect( rectClient, clrHilight, clrHilight ); rectClient.DeflateRect(1,1); dc.Draw3dRect( rectClient, clrHilight, clrHilight ); dc.FillSolidRect( rectClient.left-2, rectClient.top, 3, rectClient.Height(), clrWindow ); if( _pcfd.m_bHover || _pcfd.m_bPushed ) dc.FillSolidRect( rectClient, clrHilight ); rectClient.InflateRect(1,1); dc.FillSolidRect( &rectClient, ( _pcfd.m_clrForceNAContent == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? clrFaceOut : _pcfd.m_clrForceNAContent ); CFont font; int ppi = dc.GetDeviceCaps(LOGPIXELSX); int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi font.CreatePointFont(pointsize, _T("Marlett")); PAINTPUSHBUTTONDATA _ppbd( this, true, rectClient, _T("6"), NULL, true, (_pcfd.m_bHover||_pcfd.m_bPushed) ? true : false, _pcfd.m_bPushed ? true : false, false, _pcfd.m_bEnabled, true, false, false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, (HFONT)font.GetSafeHandle(), // = NULL false, 0, ( _pcfd.m_clrForceNAContent == COLORREF(-1L) || _pcfd.m_bHover || _pcfd.m_bPushed ) ? false : true ); PaintPushButton( dc, _ppbd ); if( !(_pcfd.m_bHover || _pcfd.m_bPushed) ) { dc.Draw3dRect( rectClient, clrHilight, clrHilight ); } if(_pcfd.m_bHover || _pcfd.m_bPushed) { rectClient2.DeflateRect(1,1); HBRUSH hOldBrush = (HBRUSH) ::SelectObject( dc.GetSafeHdc(), ::GetStockObject(NULL_BRUSH) ); COLORREF clrOld = dc.SetTextColor( clrShadow ); dc.Rectangle( &rectClient2 ); dc.SetTextColor( clrOld ); if( hOldBrush ) ::SelectObject( dc.GetSafeHdc(), hOldBrush ); } dc.RestoreDC( nSavedDC ); } void CExtPaintManagerOffice2003::PaintComboFrame( CDC &dc, CExtPaintManager::PAINTCOMBOFRAMEDATA & _pcfd ) { if( _pcfd.m_pHelperSrc == NULL || (! _pcfd.m_bEnabled ) || _pcfd.m_clrForceNABorder != COLORREF(-1L) || _pcfd.m_clrForceNAContent != COLORREF(-1L) || _pcfd.m_clrForceActiveOuterBorder != COLORREF(-1L) || (! ( _pcfd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CComboBox)) || _pcfd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtBarButton)) ) ) || (! GetCb2DbTransparentMode(_pcfd.m_pHelperSrc) ) || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintComboFrame( dc, _pcfd ); return; } int nDxHumb = ::GetSystemMetrics( SM_CXHTHUMB ); CRect rcClient( _pcfd.m_rcClient ); CRect rcEraser( rcClient ); rcEraser.DeflateRect(1,1); CRect rcHoverFrame( rcEraser ); CRect rcButton( rcEraser ); rcButton.left = rcButton.right - nDxHumb; CRect rcClientItem( rcEraser ); rcClientItem.DeflateRect(1,1,nDxHumb-1+3,1); CRgn rgnClip, rgnClientItem; if( rgnClip.CreateRectRgnIndirect(&rcClient) && rgnClientItem.CreateRectRgnIndirect(&rcClientItem) && rgnClip.CombineRgn( &rgnClip, &rgnClientItem, RGN_DIFF ) != ERROR ) dc.SelectClipRgn( &rgnClip ); CComboBox * pWndCombo = DYNAMIC_DOWNCAST( CComboBox, _pcfd.m_pHelperSrc ); if( pWndCombo != NULL ) { ASSERT_VALID( pWndCombo ); if( !PaintDockerBkgnd( dc, pWndCombo ) ) { if( rgnClip.GetSafeHandle() != NULL ) dc.SelectClipRgn( NULL ); CExtPaintManagerXP::PaintComboFrame( dc, _pcfd ); return; } } // if( pWndCombo != NULL ) int nSavedDC = dc.SaveDC(); COLORREF clrWindow = GetColor( COLOR_WINDOW ); dc.Draw3dRect( rcEraser, clrWindow, clrWindow ); rcEraser.DeflateRect(0,1,nDxHumb-1,1); dc.Draw3dRect( rcEraser, clrWindow, clrWindow ); rcEraser.DeflateRect(0,0,1,0); dc.Draw3dRect( rcEraser, clrWindow, clrWindow ); rcEraser.DeflateRect(0,0,1,0); dc.Draw3dRect( rcEraser, clrWindow, clrWindow ); rcEraser.DeflateRect(0,0,1,0); dc.Draw3dRect( rcEraser, clrWindow, clrWindow ); if( _pcfd.m_bHover || _pcfd.m_bPushed ) { COLORREF clrBorder = GetColor( XPCLR_HILIGHT_BORDER ); dc.Draw3dRect( rcHoverFrame, clrBorder, clrBorder ); } CFont font; int ppi = dc.GetDeviceCaps(LOGPIXELSX); int pointsize = MulDiv(60, 96, ppi); // 6 points at 96 ppi font.CreatePointFont(pointsize, _T("Marlett")); PAINTPUSHBUTTONDATA _ppbd( this, true, rcButton, _T("6"), NULL, true, (_pcfd.m_bHover||_pcfd.m_bPushed) ? true : false, _pcfd.m_bPushed ? true : false, false, _pcfd.m_bEnabled, true, false, false, CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT, (HFONT)font.GetSafeHandle(), // = NULL false, 0, ( _pcfd.m_bHover || _pcfd.m_bPushed ) ? false : true ); PaintPushButton( dc, _ppbd ); if( rgnClip.GetSafeHandle() != NULL ) dc.SelectClipRgn( NULL ); dc.RestoreDC( nSavedDC ); } int CExtPaintManager::GetMenuBorderSize() { return 4; } void CExtPaintManager::PaintMenuBorder( CDC & dc, const RECT & rectClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rectClient ) ) return; CRect rc(rectClient); dc.Draw3dRect( &rc, GetColor(CLR_3DFACE_OUT), GetColor(CLR_3DDKSHADOW_OUT) ); rc.DeflateRect(1,1); dc.Draw3dRect( &rc, GetColor(CLR_3DHILIGHT_OUT), GetColor(CLR_3DSHADOW_OUT) ); COLORREF clrFace = GetColor(CLR_3DFACE_OUT); rc.DeflateRect(1,1); dc.Draw3dRect(&rc,clrFace,clrFace); rc.DeflateRect(1,1); dc.Draw3dRect(&rc,clrFace,clrFace); } int CExtPaintManager::GetMenuShadowSize() { return 4; // 5; // (+ 2.23) } int CExtPaintManagerXP::GetMenuShadowSize() { return 4; // 5; // (+ 2.23) } int CExtPaintManagerXP::GetMenuBorderSize() { return 2; } void CExtPaintManagerXP::PaintMenuBorder( CDC & dc, const RECT & rectClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rectClient ) ) return; CRect rc(rectClient); COLORREF clr = GetColor( XPCLR_MENU_BORDER ); dc.Draw3dRect(&rc,clr,clr); COLORREF clrFace = GetColor(XPCLR_3DFACE_NORMAL); rc.DeflateRect(1,1); dc.Draw3dRect(&rc,clrFace,clrFace); rc.right--; rc.bottom--; dc.Draw3dRect(&rc,clrFace,clrFace); } bool CExtPaintManager::IsMenuMustCombineExcludeArea() { // // Implementadion of CExtPaintManager::PaintMenuCombinedArea() // is provided, but office 98/2k does not combine its menu area // with exclude area. interesting? uncomment and play with it! // // return true; // return false; } bool CExtPaintManagerXP::IsMenuMustCombineExcludeArea() { return true; } void CExtPaintManager::PaintMenuCombinedArea( CDC & dc, const RECT & rcArea, const RECT & rcClient, int eCombineAlign, // CExtPopupMenuWnd::e_combine_align_t values CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rcArea ) ) return; dc.SelectClipRgn( NULL ); ASSERT( eCombineAlign != CExtPopupMenuWnd::__CMBA_NONE ); int nExpandSize = GetMenuBorderSize() - 1; CRect _rcClient( rcClient ); CRect _rcArea( rcArea ); _rcArea.InflateRect( (eCombineAlign==CExtPopupMenuWnd::__CMBA_RIGHT) ? nExpandSize : 0, (eCombineAlign==CExtPopupMenuWnd::__CMBA_BOTTOM) ? nExpandSize : 0, (eCombineAlign==CExtPopupMenuWnd::__CMBA_LEFT) ? nExpandSize : 0, (eCombineAlign==CExtPopupMenuWnd::__CMBA_TOP) ? nExpandSize : 0 ); dc.FillSolidRect( &_rcArea, GetColor( CLR_3DFACE_OUT ) ); // _rcArea = rcArea; COLORREF clrMenuBorderLTo = GetColor( CLR_3DFACE_OUT ); COLORREF clrMenuBorderLTi = GetColor( CLR_3DHILIGHT_OUT ); COLORREF clrMenuBorderRBo = GetColor( CLR_3DSHADOW_OUT ); COLORREF clrMenuBorderRBi = GetColor( CLR_3DDKSHADOW_OUT ); switch( eCombineAlign ) { case CExtPopupMenuWnd::__CMBA_TOP: _rcArea.InflateRect( 0, 0, 0, nExpandSize ); _rcClient.InflateRect( -nExpandSize, 0 ); break; case CExtPopupMenuWnd::__CMBA_BOTTOM: _rcArea.InflateRect( 0, nExpandSize, 0, 0 ); _rcClient.InflateRect( -nExpandSize, 0 ); break; case CExtPopupMenuWnd::__CMBA_LEFT: _rcArea.InflateRect( 0, 0, nExpandSize, 0 ); _rcClient.InflateRect( 0, -nExpandSize ); break; case CExtPopupMenuWnd::__CMBA_RIGHT: _rcArea.InflateRect( nExpandSize, 0, 0, 0 ); _rcClient.InflateRect( 0, -nExpandSize ); break; #ifdef _DEBUG default: ASSERT(FALSE); break; #endif // _DEBUG } // switch( eCombineAlign ) dc.ExcludeClipRect( &_rcClient ); int cx = _rcArea.Width(); int cy = _rcArea.Height(); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_BOTTOM ) dc.FillSolidRect(_rcArea.left, _rcArea.top, cx - 1, 1, clrMenuBorderLTo); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_RIGHT ) dc.FillSolidRect(_rcArea.left, _rcArea.top, 1, cy - 1, clrMenuBorderLTo); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_LEFT ) dc.FillSolidRect(_rcArea.left + cx, _rcArea.top, -1, cy, clrMenuBorderRBo); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_TOP ) dc.FillSolidRect(_rcArea.left, _rcArea.top + cy, cx, -1, clrMenuBorderRBo); _rcArea.DeflateRect(1,1,1,1); cx = _rcArea.Width(); cy = _rcArea.Height(); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_BOTTOM ) dc.FillSolidRect(_rcArea.left, _rcArea.top, cx - 1, 1, clrMenuBorderLTi); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_RIGHT ) dc.FillSolidRect(_rcArea.left, _rcArea.top, 1, cy - 1, clrMenuBorderLTi); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_LEFT ) dc.FillSolidRect(_rcArea.left + cx, _rcArea.top, -1, cy, clrMenuBorderRBi); if( eCombineAlign != CExtPopupMenuWnd::__CMBA_TOP ) dc.FillSolidRect(_rcArea.left, _rcArea.top + cy, cx, -1, clrMenuBorderRBi); /* dc.ExcludeClipRect( &_rcClient ); dc.Draw3dRect( &_rcArea, clrMenuBorderLTo, clrMenuBorderRBo ); _rcArea.DeflateRect(1,1,1,1); dc.Draw3dRect( &_rcArea, clrMenuBorderLTi, clrMenuBorderRBi ); */ dc.SelectClipRgn( NULL ); } void CExtPaintManagerXP::PaintMenuCombinedArea( CDC & dc, const RECT & rcArea, const RECT & rcClient, int eCombineAlign, // CExtPopupMenuWnd::e_combine_align_t values CObject * pHelperSrc, LPARAM lParam // = 0L ) { pHelperSrc; lParam; if( ::IsRectEmpty( &rcArea ) ) return; ASSERT( eCombineAlign != CExtPopupMenuWnd::__CMBA_NONE ); CRect _rcArea( rcArea ); CRect _rcClient( rcClient ); dc.FillSolidRect( &_rcArea, GetColor( XPCLR_3DFACE_DARK ) ); switch( eCombineAlign ) { case CExtPopupMenuWnd::__CMBA_TOP: case CExtPopupMenuWnd::__CMBA_BOTTOM: _rcClient.InflateRect( -1, 0 ); break; case CExtPopupMenuWnd::__CMBA_LEFT: case CExtPopupMenuWnd::__CMBA_RIGHT: _rcClient.InflateRect( 0, -1 ); break; #ifdef _DEBUG default: ASSERT(FALSE); break; #endif // _DEBUG } // switch( eCombineAlign ) dc.ExcludeClipRect( &_rcClient ); COLORREF clrMenuBorder = GetColor( XPCLR_MENU_BORDER ); dc.Draw3dRect( &_rcArea, clrMenuBorder, clrMenuBorder ); dc.SelectClipRgn( NULL ); } void CExtPaintManagerOffice2003::PaintMenuCombinedArea( CDC & dc, const RECT & rcArea, const RECT & rcClient, int eCombineAlign, // CExtPopupMenuWnd::e_combine_align_t values CObject * pHelperSrc, LPARAM lParam // = 0L ) { if( ::IsRectEmpty( &rcArea ) ) return; ASSERT( eCombineAlign != CExtPopupMenuWnd::__CMBA_NONE ); bool bStyleOffice2003 = true; CExtPopupMenuWnd * pPopup = NULL; if( pHelperSrc == NULL || (! pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) ) || m_bmpCtBarGradientHorz.GetSafeHandle() == NULL || m_bmpCtBarGradientVert.GetSafeHandle() == NULL || m_bmpDockerGradient.GetSafeHandle() == NULL || stat_GetBPP() <= 8 ) bStyleOffice2003 = false; else { pPopup = STATIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc ); ASSERT_VALID( pPopup ); } if( !bStyleOffice2003 ) { CExtPaintManagerXP::PaintMenuCombinedArea( dc, rcArea, rcClient, eCombineAlign, pHelperSrc, lParam ); return; } ASSERT_VALID( pPopup ); CObject * pObjCoockie = pPopup->GetCoockieAsObject(); CExtToolControlBar * pToolBar = NULL; int nTbbMenuTrackingBtnIdx = -1; CExtBarButton * pTBB = NULL; if( pObjCoockie != NULL && pObjCoockie->IsKindOf( RUNTIME_CLASS(CExtToolControlBar) ) ) { // if menu coockie for combined content callback is a CExtToolControlBar pToolBar = STATIC_DOWNCAST( CExtToolControlBar, pObjCoockie ); ASSERT_VALID( pToolBar ); if( pToolBar->m_bPresubclassDialogMode || pToolBar->m_pDockSite == NULL ) { CExtPaintManagerXP::PaintMenuCombinedArea( dc, rcArea, rcClient, eCombineAlign, pHelperSrc, lParam ); return; } nTbbMenuTrackingBtnIdx = pToolBar->GetMenuTrackingButton(); if( nTbbMenuTrackingBtnIdx >= 0 ) { pTBB = pToolBar->GetButton(nTbbMenuTrackingBtnIdx); ASSERT_VALID( pTBB ); } // if( nTbbMenuTrackingBtnIdx >= 0 ) } // if menu coockie for combined content callback is a CExtToolControlBar if( pToolBar != NULL && pTBB != NULL && pTBB->IsKindOf( RUNTIME_CLASS(CExtBarContentExpandButton) ) && (! pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) ) ) { // if toolbar content expand button if( (!( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater )) ) { COLORREF clrFillUpdate = GetColor( _2003CLR_EXPBTN_PRESSED_LIGHT ); switch( eCombineAlign ) { case CExtPopupMenuWnd::__CMBA_TOP: dc.FillSolidRect( rcArea.right - m_sizeToolBarRgnRounders.cx - 2, rcArea.bottom - m_sizeToolBarRgnRounders.cy - 1, m_sizeToolBarRgnRounders.cx + 2, m_sizeToolBarRgnRounders.cy, clrFillUpdate ); break; case CExtPopupMenuWnd::__CMBA_BOTTOM: dc.FillSolidRect( rcArea.right - m_sizeToolBarRgnRounders.cx - 2, rcArea.top + 1, m_sizeToolBarRgnRounders.cx + 2, m_sizeToolBarRgnRounders.cy, clrFillUpdate ); dc.FillSolidRect( rcArea.right - m_sizeToolBarRgnRounders.cx, rcArea.bottom - m_sizeToolBarRgnRounders.cy - 1, m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy, clrFillUpdate ); break; case CExtPopupMenuWnd::__CMBA_LEFT: dc.FillSolidRect( rcArea.right - m_sizeToolBarRgnRounders.cx - 2, rcArea.bottom - m_sizeToolBarRgnRounders.cy, m_sizeToolBarRgnRounders.cx + 1, m_sizeToolBarRgnRounders.cy, clrFillUpdate ); break; case CExtPopupMenuWnd::__CMBA_RIGHT: dc.FillSolidRect( rcArea.right - m_sizeToolBarRgnRounders.cx, rcArea.bottom - m_sizeToolBarRgnRounders.cy - 1, m_sizeToolBarRgnRounders.cx, m_sizeToolBarRgnRounders.cy, clrFillUpdate ); break; #ifdef _DEBUG default: ASSERT(FALSE); break; #endif // _DEBUG } // switch( eCombineAlign ) } return; } // if toolbar content expand button CRect _rcArea( rcArea ); CRect _rcClient( rcClient ); switch( eCombineAlign ) { case CExtPopupMenuWnd::__CMBA_TOP: case CExtPopupMenuWnd::__CMBA_BOTTOM: _rcClient.InflateRect( -1, 0 ); break; case CExtPopupMenuWnd::__CMBA_LEFT: case CExtPopupMenuWnd::__CMBA_RIGHT: _rcClient.InflateRect( 0, -1 ); break; #ifdef _DEBUG default: ASSERT(FALSE); break; #endif // _DEBUG } // switch( eCombineAlign ) bool b2003StyleMiddleBorder = true; bool bNoGradientOverCombineArea = false; if( pToolBar != NULL && pTBB != NULL && ( pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) || ( pTBB->GetIconPtr() != NULL && (! pTBB->GetIconPtr()->IsEmpty() ) ) ) ) b2003StyleMiddleBorder = false; else { if( pPopup->IsToolBtnCombinedArea() ) bNoGradientOverCombineArea = true; else b2003StyleMiddleBorder = false; } bool bPreEmptyClipRgn = false; COLORREF clrBottomFill = GetColor( bNoGradientOverCombineArea ? XPCLR_3DFACE_DARK : XPCLR_3DFACE_NORMAL ); if( !b2003StyleMiddleBorder ) { dc.FillSolidRect( &_rcArea, clrBottomFill ); dc.ExcludeClipRect( &_rcClient ); } // if( !b2003StyleMiddleBorder ) else { if( eCombineAlign == CExtPopupMenuWnd::__CMBA_LEFT ) _rcArea.InflateRect( 0, 0, -1, 0 ); dc.ExcludeClipRect( &_rcClient ); dc.FillSolidRect( &_rcArea, clrBottomFill ); bPreEmptyClipRgn = true; } // else from if( !b2003StyleMiddleBorder ) if( !bNoGradientOverCombineArea ) { CDC & dcCompat = CachedDcGet( m_bmpCtBarGradientHorz ); if( dcCompat.GetSafeHdc() != NULL ) { CSize sizeShade = m_sizeCtBarGradientHorz; int nOldStretchBltMode = dc.SetStretchBltMode( g_PaintManager.m_bIsWinNT ? HALFTONE : COLORONCOLOR ); ::SetBrushOrgEx( dc, 0, 0, NULL ); dc.StretchBlt( // (/2) makes area lighter and more smoth fill _rcArea.left, _rcArea.top, _rcArea.Width(), _rcArea.Height(), &dcCompat, 0, 0, sizeShade.cx/2, sizeShade.cy/2, SRCCOPY ); dc.SetStretchBltMode( nOldStretchBltMode ); } // if( dcCompat.GetSafeHdc() != NULL ) #ifdef _DEBUG else { ASSERT( FALSE ); } // else from if( dcCompat.GetSafeHdc() != NULL ) #endif // _DEBUG } // if( !bNoGradientOverCombineArea ) if( bPreEmptyClipRgn ) dc.SelectClipRgn( NULL ); COLORREF clrMenuBorder = GetColor( XPCLR_MENU_BORDER ); dc.Draw3dRect( &_rcArea, clrMenuBorder, clrMenuBorder ); dc.SelectClipRgn( NULL ); } CExtPaintManager::PAINTCONTROLBARBORDERSDATA::PAINTCONTROLBARBORDERSDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_eCBBT( CExtPaintManager::e_control_bar_border_type_t::__CB_OUTER_DOCKBAR ) , m_dwStyle( 0L ) , m_rc( 0,0,0,0 ) { } CExtPaintManager::PAINTCONTROLBARBORDERSDATA::PAINTCONTROLBARBORDERSDATA( CObject * pHelperSrc, int eCBBT, // CExtPaintManager::e_control_bar_border_type_t DWORD dwStyle, const RECT & rc ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_eCBBT( eCBBT ) , m_dwStyle( dwStyle ) , m_rc( rc ) { } void CExtPaintManager::PaintControlBarBordersDefImpl( CDC & dc, CExtPaintManager::PAINTCONTROLBARBORDERSDATA & _pcbbd, COLORREF clrHi, COLORREF clrLo ) { if( !(_pcbbd.m_dwStyle & CBRS_BORDER_ANY) ) return; // prepare for dark lines // ASSERT( _pcbbd.m_rc.top == 0 && _pcbbd.m_rc.left == 0 ); CRect rc1( _pcbbd.m_rc ), rc2( _pcbbd.m_rc ); COLORREF clr = clrLo; // afxData.bWin4 // ? afxData.clrBtnShadow // : afxData.clrWindowFrame; GetColor( CExtPaintManager::CLR_3DFACE_OUT ); // draw dark line one pixel back/up if( _pcbbd.m_dwStyle & CBRS_BORDER_3D ) { rc1.right -= CX_BORDER; rc1.bottom -= CY_BORDER; } if( _pcbbd.m_dwStyle & CBRS_BORDER_TOP ) rc2.top += afxData.cyBorder2; if( _pcbbd.m_dwStyle & CBRS_BORDER_BOTTOM ) rc2.bottom -= afxData.cyBorder2; // draw left and top if( _pcbbd.m_dwStyle & CBRS_BORDER_LEFT ) dc.FillSolidRect( 0, rc2.top, CX_BORDER, rc2.Height(), clr ); if( _pcbbd.m_dwStyle & CBRS_BORDER_TOP ) dc.FillSolidRect( 0, 0, _pcbbd.m_rc.right, CY_BORDER, clr ); // draw right and bottom if( _pcbbd.m_dwStyle & CBRS_BORDER_RIGHT ) dc.FillSolidRect( rc1.right, rc2.top, -CX_BORDER, rc2.Height(), clr ); if( _pcbbd.m_dwStyle & CBRS_BORDER_BOTTOM ) dc.FillSolidRect( 0, rc1.bottom, _pcbbd.m_rc.right, -CY_BORDER, clr ); if( _pcbbd.m_dwStyle & CBRS_BORDER_3D ) { // prepare for hilite lines // clr = afxData.clrBtnHilite; clr = clrHi; // draw left and top if( _pcbbd.m_dwStyle & CBRS_BORDER_LEFT ) dc.FillSolidRect( 1, rc2.top, CX_BORDER, rc2.Height(), clr ); if( _pcbbd.m_dwStyle & CBRS_BORDER_TOP ) dc.FillSolidRect( 0, 1, _pcbbd.m_rc.right, CY_BORDER, clr ); // draw right and bottom if( _pcbbd.m_dwStyle & CBRS_BORDER_RIGHT ) dc.FillSolidRect( _pcbbd.m_rc.right, rc2.top, -CX_BORDER, rc2.Height(), clr ); if( _pcbbd.m_dwStyle & CBRS_BORDER_BOTTOM ) dc.FillSolidRect( 0, _pcbbd.m_rc.bottom, _pcbbd.m_rc.right, -CY_BORDER, clr ); } // if( _pcbbd.m_dwStyle & CBRS_BORDER_LEFT ) // _pcbbd.m_rc.left += afxData.cxBorder2; // if( _pcbbd.m_dwStyle & CBRS_BORDER_TOP ) // _pcbbd.m_rc.top += afxData.cyBorder2; // if( _pcbbd.m_dwStyle & CBRS_BORDER_RIGHT ) // _pcbbd.m_rc.right -= afxData.cxBorder2; // if( _pcbbd.m_dwStyle & CBRS_BORDER_BOTTOM ) // _pcbbd.m_rc.bottom -= afxData.cyBorder2; } void CExtPaintManager::PaintControlBarBorders( CDC & dc, CExtPaintManager::PAINTCONTROLBARBORDERSDATA & _pcbbd ) { if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) { dc.Draw3dRect( &_pcbbd.m_rc, GetColor( CLR_3DSHADOW_OUT ), GetColor( CLR_3DHILIGHT_OUT ) ); return; } // if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) COLORREF clr = GetColor( CLR_3DFACE_OUT ); PaintControlBarBordersDefImpl( dc, _pcbbd, clr, clr ); } void CExtPaintManagerXP::PaintControlBarBorders( CDC & dc, CExtPaintManager::PAINTCONTROLBARBORDERSDATA & _pcbbd ) { if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) { COLORREF clr = GetColor( COLOR_3DSHADOW ); dc.Draw3dRect( &_pcbbd.m_rc, clr, clr ); return; } // if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) COLORREF clr = GetColor( CLR_3DFACE_OUT ); PaintControlBarBordersDefImpl( dc, _pcbbd, clr, clr ); } void CExtPaintManagerOffice2003::PaintControlBarBorders( CDC & dc, CExtPaintManager::PAINTCONTROLBARBORDERSDATA & _pcbbd ) { if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) { COLORREF clr = GetColor( _2003CLR_STATUSBAR_ITEM ); dc.Draw3dRect( &_pcbbd.m_rc, clr, clr ); return; } // if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM ) CExtPaintManagerXP::PaintControlBarBorders( dc, _pcbbd ); } void CExtPaintManager::PaintResizableBarChildNcAreaRect( CDC & dc, const RECT & rc, CObject * pHelperSrc, LPARAM lParam // = 0L ) { PaintTabNcAreaRect( dc, rc, pHelperSrc, lParam ); } void CExtPaintManagerXP::PaintResizableBarChildNcAreaRect( CDC & dc, const RECT & rc, CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManager::PaintResizableBarChildNcAreaRect( dc, rc, pHelperSrc, lParam ); } HICON CExtPaintManager::stat_GenerateColorIconBox( COLORREF clrIcon ) { CWindowDC dc( NULL ); ICONINFO iiNewIcon; ::memset( &iiNewIcon, 0, sizeof(ICONINFO) ); iiNewIcon.fIcon = true; HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); ASSERT( hIconDC != NULL && hMaskDC != NULL ); iiNewIcon.hbmColor = ::CreateCompatibleBitmap( dc.GetSafeHdc(), 16, 16 ); ASSERT( iiNewIcon.hbmColor != NULL ); iiNewIcon.hbmMask = ::CreateCompatibleBitmap( hMaskDC, 16, 16 ); ASSERT( iiNewIcon.hbmMask != NULL ); HGDIOBJ hOldIconDC = ::SelectObject( hIconDC, iiNewIcon.hbmColor ); ASSERT( hOldIconDC != NULL ); HGDIOBJ hOldMaskDC = ::SelectObject( hMaskDC, iiNewIcon.hbmMask ); ASSERT( hOldMaskDC != NULL ); CBrush brColorItem( clrIcon ); CRect rcColorItem(0,0,16,16); ::FillRect( hIconDC, &rcColorItem, (HBRUSH)brColorItem.GetSafeHandle() ); ::FillRect( hMaskDC, &rcColorItem, (HBRUSH)::GetStockObject(BLACK_BRUSH) ); ::SelectObject(hIconDC,hOldIconDC); ::SelectObject(hMaskDC,hOldMaskDC); HICON hIcon = ::CreateIconIndirect(&iiNewIcon); ASSERT( hIcon != NULL ); ::DeleteObject(iiNewIcon.hbmColor); ::DeleteObject(iiNewIcon.hbmMask); ::DeleteDC(hMaskDC); ::DeleteDC(hIconDC); return hIcon; } HICON CExtPaintManager::stat_GenerateColorIconFrame( COLORREF clrIcon ) { CWindowDC dc( NULL ); ICONINFO iiNewIcon; iiNewIcon.fIcon = true; HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); ASSERT( hIconDC != NULL && hMaskDC != NULL ); iiNewIcon.hbmColor = ::CreateCompatibleBitmap( dc.GetSafeHdc(), 16, 16 ); ASSERT( iiNewIcon.hbmColor != NULL ); iiNewIcon.hbmMask = ::CreateCompatibleBitmap( hMaskDC, 16, 16 ); ASSERT( iiNewIcon.hbmMask != NULL ); HGDIOBJ hOldIconDC = ::SelectObject( hIconDC, iiNewIcon.hbmColor ); ASSERT( hOldIconDC != NULL ); HGDIOBJ hOldMaskDC = ::SelectObject( hMaskDC, iiNewIcon.hbmMask ); ASSERT( hOldMaskDC != NULL ); CBrush brColorItem( clrIcon ); CRect rcColorItem(0,0,16,16); ::FillRect( hMaskDC, &rcColorItem, (HBRUSH)::GetStockObject(WHITE_BRUSH) ); rcColorItem.DeflateRect( 1, 2 ); ::FillRect( hMaskDC, &rcColorItem, (HBRUSH)::GetStockObject(BLACK_BRUSH) ); ::FillRect( hIconDC, &rcColorItem, (HBRUSH)brColorItem.GetSafeHandle() ); rcColorItem.DeflateRect( 2, 2 ); ::FillRect( hMaskDC, &rcColorItem, (HBRUSH)::GetStockObject(WHITE_BRUSH) ); ::FillRect( hIconDC, &rcColorItem, (HBRUSH)::GetStockObject(BLACK_BRUSH) ); ::SelectObject(hIconDC,hOldIconDC); ::SelectObject(hMaskDC,hOldMaskDC); HICON hIcon = ::CreateIconIndirect(&iiNewIcon); ASSERT( hIcon != NULL ); ::DeleteObject(iiNewIcon.hbmColor); ::DeleteObject(iiNewIcon.hbmMask); ::DeleteDC(hMaskDC); ::DeleteDC(hIconDC); return hIcon; } HICON CExtPaintManager::stat_GenerateColorIconChar( COLORREF clrIcon, HFONT hFontForLetter, __EXT_MFC_SAFE_TCHAR tChr // = _T('A') ) { ASSERT( tChr != _T('\0') ); ASSERT( hFontForLetter != NULL ); CWindowDC dc( NULL ); ICONINFO iiNewIcon; iiNewIcon.fIcon = true; HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() ); ASSERT( hIconDC != NULL && hMaskDC != NULL ); iiNewIcon.hbmColor = ::CreateCompatibleBitmap( dc.GetSafeHdc(), 16, 16 ); ASSERT( iiNewIcon.hbmColor != NULL ); iiNewIcon.hbmMask = ::CreateCompatibleBitmap( hMaskDC, 16, 16 ); ASSERT( iiNewIcon.hbmMask != NULL ); HGDIOBJ hOldIconDC = ::SelectObject( hIconDC, iiNewIcon.hbmColor ); ASSERT( hOldIconDC != NULL ); HGDIOBJ hOldMaskDC = ::SelectObject( hMaskDC, iiNewIcon.hbmMask ); ASSERT( hOldMaskDC != NULL ); CRect rcColorItem(0,0,16,16); ::FillRect( hMaskDC, &rcColorItem, (HBRUSH)::GetStockObject(WHITE_BRUSH) ); ASSERT( hFontForLetter != NULL ); HGDIOBJ hOldFontIconDC = ::SelectObject( hIconDC, hFontForLetter ); HGDIOBJ hOldFontMaskDC = ::SelectObject( hMaskDC, hFontForLetter ); CRect rcText( rcColorItem ); rcText.bottom -= 4; CExtSafeString sText( (TCHAR)tChr, 1 ); ::SetTextColor( hIconDC, RGB(0,0,0) ); ::SetBkMode( hIconDC, TRANSPARENT ); ::DrawText( hIconDC, sText, sText.GetLength(), &rcText, DT_SINGLELINE|DT_CENTER|DT_VCENTER ); ::SetTextColor( hMaskDC, RGB(0,0,0) ); ::SetBkMode( hMaskDC, TRANSPARENT ); ::DrawText( hMaskDC, sText, sText.GetLength(), &rcText, DT_SINGLELINE|DT_CENTER|DT_VCENTER ); ::SelectObject( hIconDC, hOldFontIconDC ); ::SelectObject( hMaskDC, hOldFontMaskDC ); CRect rcColorBar( rcText ); rcColorBar.OffsetRect( 0, rcColorBar.Height() + 1 ); rcColorBar.bottom = rcColorBar.top + 3; rcColorBar.DeflateRect( 2, 0 ); CBrush brColor( clrIcon ); ::FillRect( hIconDC, &rcColorBar, (HBRUSH)brColor.GetSafeHandle() ); ::FillRect( hMaskDC, &rcColorBar, (HBRUSH)::GetStockObject(BLACK_BRUSH) ); ::SelectObject(hIconDC,hOldIconDC); ::SelectObject(hMaskDC,hOldMaskDC); HICON hIcon = ::CreateIconIndirect(&iiNewIcon); ASSERT( hIcon != NULL ); ::DeleteObject(iiNewIcon.hbmColor); ::DeleteObject(iiNewIcon.hbmMask); ::DeleteDC(hMaskDC); ::DeleteDC(hIconDC); return hIcon; } #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL) void CExtPaintManager::PaintShortcutListBkgnd( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( rcClient.left >= rcClient.right || rcClient.top >= rcClient.bottom || (! dc.RectVisible( &rcClient ) ) ) return; COLORREF clrBk = GetColor( COLOR_3DSHADOW ); dc.FillSolidRect( &rcClient, clrBk ); } void CExtPaintManagerXP::PaintShortcutListBkgnd( CDC & dc, const RECT & rcClient, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( rcClient.left >= rcClient.right || rcClient.top >= rcClient.bottom || (! dc.RectVisible( &rcClient ) ) ) return; COLORREF clrBk = GetColor( CLR_3DFACE_OUT ); dc.FillSolidRect( &rcClient, clrBk ); } void CExtPaintManager::PaintShortcutListScrollButton( CDC & dc, bool bHorzLayout, const RECT & rcButton, bool bUpOrLeftBtn, bool bHover, bool bPressed, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( ::IsRectEmpty( &rcButton ) || ( ! dc.RectVisible( &rcButton ) ) ) return; COLORREF clr3dFace = GetColor( COLOR_3DFACE ); dc.FillSolidRect( &rcButton, clr3dFace ); CRect rcGlyph( rcButton ); COLORREF clrOuterLT = clr3dFace; COLORREF clrOuterRB = clr3dFace; COLORREF clrInnerLT = clr3dFace; COLORREF clrInnerRB = clr3dFace; if( bPressed ) { rcGlyph.OffsetRect( 1, 1 ); clrOuterLT = GetColor( COLOR_3DDKSHADOW ); clrOuterRB = GetColor( COLOR_3DHILIGHT ); clrInnerLT = GetColor( COLOR_3DSHADOW ); } // if( bPressed ) else { if( bHover ) { clrOuterRB = GetColor( COLOR_3DDKSHADOW ); clrInnerLT = GetColor( COLOR_3DHILIGHT ); clrInnerRB = GetColor( COLOR_3DSHADOW ); } // if( bHover ) else { clrOuterLT = GetColor( COLOR_3DHILIGHT ); clrOuterRB = GetColor( COLOR_3DSHADOW ); } // else from if( bHover ) } // else from if( bPressed ) COLORREF ColorValues[2] = { RGB(0,0,0), GetColor(COLOR_BTNTEXT) }; PaintGlyphCentered( dc, rcGlyph, * g_DockingCaptionGlyphs[ bHorzLayout ? ( bUpOrLeftBtn ? __DCBT_ARROW_LEFT : __DCBT_ARROW_RIGHT ) : ( bUpOrLeftBtn ? __DCBT_ARROW_UP : __DCBT_ARROW_DOWN ) ], ColorValues ); dc.Draw3dRect( &rcButton, clrOuterLT, clrOuterRB ); CRect rcButton2(rcButton); rcButton2.DeflateRect( 1, 1 ); dc.Draw3dRect( &rcButton2, clrInnerLT, clrInnerRB ); } void CExtPaintManagerXP::PaintShortcutListScrollButton( CDC & dc, bool bHorzLayout, const RECT & rcButton, bool bUpOrLeftBtn, bool bHover, bool bPressed, CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManager::PaintShortcutListScrollButton( dc, bHorzLayout, rcButton, bUpOrLeftBtn, bHover, bPressed, pHelperSrc, lParam ); } CExtPaintManager::PAINTSHORTCUTLISTITEMSDATA::PAINTSHORTCUTLISTITEMSDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_dwShortcutListStyle( 0L ) , m_hItemTextFont( (HFONT)::GetStockObject(DEFAULT_GUI_FONT) ) , m_pIconBig( NULL ) , m_pIconSmall( NULL ) , m_lParamItem( 0L ) , m_rcBoundsAll( 0,0,0,0 ) , m_rcBoundsIcon( 0,0,0,0 ) , m_rcBoundsText( 0,0,0,0 ) , m_rcCtrlClient( 0,0,0,0 ) , m_sText( _T("") ) , m_bHover( false ) , m_bPressed( false ) , m_bVisible( false ) , m_bChecked( false ) , m_bExpandMode( false ) , m_bHorzLayout( false ) , m_bBigIconView( false ) , m_bEraseQuery( false ) { ASSERT( m_hItemTextFont != NULL ); } CExtPaintManager::PAINTSHORTCUTLISTITEMSDATA::PAINTSHORTCUTLISTITEMSDATA( CObject * pHelperSrc, DWORD dwShortcutListStyle, HFONT hItemTextFont, CExtCmdIcon * pIconBig, CExtCmdIcon * pIconSmall, LPARAM lParamItem, const RECT & rcBoundsAll, const RECT & rcBoundsIcon, const RECT & rcBoundsText, const RECT & rcCtrlClient, __EXT_MFC_SAFE_LPCTSTR sText, bool bHover, bool bPressed, bool bVisible, bool bChecked, bool bExpandMode, bool bHorzLayout, bool bBigIconView, bool bEraseQuery ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_dwShortcutListStyle( dwShortcutListStyle ) , m_hItemTextFont( hItemTextFont ) , m_pIconBig( pIconBig ) , m_pIconSmall( pIconSmall ) , m_lParamItem( lParamItem ) , m_rcBoundsAll( rcBoundsAll ) , m_rcBoundsIcon( rcBoundsIcon ) , m_rcBoundsText( rcBoundsText ) , m_rcCtrlClient( rcCtrlClient ) , m_sText( (sText == NULL) ? _T("") : sText ) , m_bHover( bHover ) , m_bPressed( bPressed ) , m_bVisible( bVisible ) , m_bChecked( bChecked ) , m_bExpandMode( bExpandMode ) , m_bHorzLayout( bHorzLayout ) , m_bBigIconView( bBigIconView ) , m_bEraseQuery( bEraseQuery ) { ASSERT( m_hItemTextFont != NULL ); } void CExtPaintManager::PaintShortcutListItem( CDC & dc, CExtPaintManager::PAINTSHORTCUTLISTITEMSDATA & _pslid ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); if( _pslid.m_bEraseQuery ) { if( !_pslid.m_bExpandMode ) return; if( _pslid.m_rcBoundsText.left < _pslid.m_rcBoundsText.right && _pslid.m_rcBoundsText.top < _pslid.m_rcBoundsText.bottom && dc.RectVisible( &_pslid.m_rcBoundsText ) ) { CRect rcExpandErase( _pslid.m_rcBoundsText ); rcExpandErase.InflateRect( __EXT_SHORTCUTLISTWND_EXPANDED_TEXT_GAP_X, __EXT_SHORTCUTLISTWND_EXPANDED_TEXT_GAP_Y ); COLORREF clrDarkBorder = GetColor( COLOR_3DDKSHADOW ); COLORREF clrInfoBk = GetColor( COLOR_INFOBK ); dc.FillSolidRect( &rcExpandErase, clrInfoBk ); dc.Draw3dRect( &rcExpandErase, clrDarkBorder, clrDarkBorder ); } return; } // if( _pslid.m_bEraseQuery ) if( _pslid.m_rcBoundsAll.IsRectEmpty() || ( ! dc.RectVisible( &_pslid.m_rcBoundsAll ) ) ) return; if( (! _pslid.m_rcBoundsIcon.IsRectEmpty() ) && dc.RectVisible( &_pslid.m_rcBoundsIcon ) ) { CExtCmdIcon * pIcon = _pslid.m_bBigIconView ? _pslid.m_pIconBig : _pslid.m_pIconSmall ; if( pIcon == NULL || pIcon->IsEmpty() ) { pIcon = _pslid.m_pIconBig; if( pIcon == NULL || pIcon->IsEmpty() ) pIcon = _pslid.m_pIconSmall; } // if( pIcon == NULL || pIcon->IsEmpty() ) CRect rcUnderIcon( _pslid.m_rcBoundsIcon ); rcUnderIcon.InflateRect( __EXT_SHORTCUTLISTWND_ICON_BORDER_GAP_X, __EXT_SHORTCUTLISTWND_ICON_BORDER_GAP_Y ); if( _pslid.m_bPressed || _pslid.m_bHover ) dc.FillSolidRect( &rcUnderIcon, GetColor( COLOR_3DSHADOW ) ); if( pIcon != NULL && (! pIcon->IsEmpty()) ) { ::DrawIconEx( dc.GetSafeHdc(), _pslid.m_rcBoundsIcon.left, _pslid.m_rcBoundsIcon.top, pIcon->GetIcon(), _pslid.m_rcBoundsIcon.Width(), _pslid.m_rcBoundsIcon.Height(), 0, (HBRUSH)NULL, DI_NORMAL ); } // if( pIcon != NULL && (! pIcon->IsEmpty()) ) if( _pslid.m_bPressed || _pslid.m_bHover ) { COLORREF clrLT = GetColor( _pslid.m_bPressed ? COLOR_3DDKSHADOW : COLOR_3DFACE ); COLORREF clrRB = GetColor( _pslid.m_bPressed ? COLOR_3DFACE : COLOR_3DDKSHADOW ); dc.Draw3dRect( &rcUnderIcon, clrLT, clrRB ); } } CExtSafeString sItemText = _pslid.m_sText; if( (! _pslid.m_rcBoundsText.IsRectEmpty() ) && dc.RectVisible( &_pslid.m_rcBoundsText ) && ( ! sItemText.IsEmpty() ) ) { LONG nItemTextLen = sItemText.GetLength(); CRect rcCaption( _pslid.m_rcBoundsText ); ASSERT( _pslid.m_hItemTextFont != NULL ); CFont * pItemFont = CFont::FromHandle( _pslid.m_hItemTextFont ); ASSERT( pItemFont != NULL ); ASSERT( pItemFont->GetSafeHandle() != NULL ); CFont * pOldFont = dc.SelectObject( pItemFont ); COLORREF clrTextOld = dc.SetTextColor( GetColor( _pslid.m_bExpandMode ? COLOR_INFOTEXT : COLOR_3DHILIGHT //_pslid.m_bEnabled ? COLOR_BTNTEXT : COLOR_3DHILIGHT ) ); int nOldBkMode = dc.SetBkMode( TRANSPARENT ); if( _pslid.m_bHorzLayout ) { rcCaption.InflateRect( 3, 0 ); CSize sizeTextMeasured = _pslid.m_rcBoundsText.Size(); UINT nOldTA = dc.SetTextAlign( TA_TOP | TA_BASELINE ); rcCaption.OffsetRect( ( (_pslid.m_dwShortcutListStyle & __ESLW_INV_VFONT) == 0 ) ? sizeTextMeasured.cx/2 : - sizeTextMeasured.cx/2 + 2 , 0 ); CPoint ptCenter = rcCaption.CenterPoint(); if( (_pslid.m_dwShortcutListStyle & __ESLW_INV_VFONT) == 0 ) ptCenter.y = rcCaption.bottom - 4 - (rcCaption.Height() - sizeTextMeasured.cy) ; else ptCenter.y = rcCaption.top + 4 ; dc.ExtTextOut( ptCenter.x, ptCenter.y, ETO_CLIPPED, &rcCaption, sItemText, sItemText.GetLength(), NULL ); dc.SetTextAlign( nOldTA ); } // if( _pslid.m_bHorzLayout ) else { CRect rcClient( _pslid.m_rcCtrlClient ); rcClient.DeflateRect( 1, 0 ); CRect rcText( max(rcCaption.left, rcClient.left), rcCaption.top, min(rcCaption.right, rcClient.right), rcCaption.bottom ); if( rcText.left < rcText.right ) { UINT nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS; dc.DrawText( sItemText, nItemTextLen, &rcText, nFormat ); } // if( rcText.left < rcText.right ) } // else from if( _pslid.m_bHorzLayout ) dc.SetBkMode( nOldBkMode ); dc.SetTextColor( clrTextOld ); dc.SelectObject( pOldFont ); } } void CExtPaintManagerXP::PaintShortcutListItem( CDC & dc, CExtPaintManager::PAINTSHORTCUTLISTITEMSDATA & _pslid ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); if( _pslid.m_bEraseQuery ) { if( !_pslid.m_bExpandMode ) return; if( _pslid.m_rcBoundsText.left < _pslid.m_rcBoundsText.right && _pslid.m_rcBoundsText.top < _pslid.m_rcBoundsText.bottom && dc.RectVisible( &_pslid.m_rcBoundsText ) ) { CRect rcExpandErase( _pslid.m_rcBoundsText ); rcExpandErase.InflateRect( __EXT_SHORTCUTLISTWND_EXPANDED_TEXT_GAP_X, __EXT_SHORTCUTLISTWND_EXPANDED_TEXT_GAP_Y ); COLORREF clrDarkBorder = GetColor( COLOR_3DDKSHADOW ); COLORREF clrInfoBk = GetColor( COLOR_INFOBK ); dc.FillSolidRect( &rcExpandErase, clrInfoBk ); dc.Draw3dRect( &rcExpandErase, clrDarkBorder, clrDarkBorder ); } return; } // if( _pslid.m_bEraseQuery ) if( _pslid.m_rcBoundsAll.IsRectEmpty() || ( ! dc.RectVisible( &_pslid.m_rcBoundsAll ) ) ) return; if( (! _pslid.m_rcBoundsIcon.IsRectEmpty() ) && dc.RectVisible( &_pslid.m_rcBoundsIcon ) ) { CExtCmdIcon * pIcon = _pslid.m_bBigIconView ? _pslid.m_pIconBig : _pslid.m_pIconSmall ; if( pIcon == NULL || pIcon->IsEmpty() ) { pIcon = _pslid.m_pIconBig; if( pIcon == NULL || pIcon->IsEmpty() ) pIcon = _pslid.m_pIconSmall; } CRect rcUnderIcon( _pslid.m_rcBoundsIcon ); rcUnderIcon.InflateRect( __EXT_SHORTCUTLISTWND_ICON_BORDER_GAP_X, __EXT_SHORTCUTLISTWND_ICON_BORDER_GAP_Y ); // dc.FillSolidRect( // &rcUnderIcon, // GetColor( // _pslid.m_bPressed // ? XPCLR_HILIGHT // : ( _pslid.m_bHover // ? CLR_3DFACE_IN // : CLR_3DFACE_OUT // ) // ) // ); if( _pslid.m_bPressed || _pslid.m_bHover ) dc.FillSolidRect( &rcUnderIcon, GetColor( _pslid.m_bPressed ? XPCLR_HILIGHT : CLR_3DFACE_IN ) ); if( pIcon != NULL && (! pIcon->IsEmpty()) ) { ::DrawIconEx( dc.GetSafeHdc(), _pslid.m_rcBoundsIcon.left, _pslid.m_rcBoundsIcon.top, pIcon->GetIcon(), _pslid.m_rcBoundsIcon.Width(), _pslid.m_rcBoundsIcon.Height(), 0, (HBRUSH)NULL, DI_NORMAL ); } // if( pIcon != NULL && (! pIcon->IsEmpty()) ) if( _pslid.m_bPressed || _pslid.m_bHover ) { COLORREF clr = GetColor( XPCLR_HILIGHT_BORDER ); dc.Draw3dRect( &rcUnderIcon, clr, clr ); } } CExtSafeString sItemText = _pslid.m_sText; if( (! _pslid.m_rcBoundsText.IsRectEmpty() ) && dc.RectVisible( &_pslid.m_rcBoundsText ) && ( ! sItemText.IsEmpty() ) ) { LONG nItemTextLen = sItemText.GetLength(); CRect rcCaption( _pslid.m_rcBoundsText ); ASSERT( _pslid.m_hItemTextFont != NULL ); CFont * pItemFont = CFont::FromHandle( _pslid.m_hItemTextFont ); ASSERT( pItemFont != NULL ); ASSERT( pItemFont->GetSafeHandle() != NULL ); CFont * pOldFont = dc.SelectObject( pItemFont ); COLORREF clrTextOld = dc.SetTextColor( GetColor( _pslid.m_bExpandMode ? COLOR_INFOTEXT : COLOR_BTNTEXT ) ); int nOldBkMode = dc.SetBkMode( TRANSPARENT ); if( _pslid.m_bHorzLayout ) { rcCaption.InflateRect( 3, 0 ); CSize sizeTextMeasured = _pslid.m_rcBoundsText.Size(); UINT nOldTA = dc.SetTextAlign( TA_TOP | TA_BASELINE ); rcCaption.OffsetRect( ( (_pslid.m_dwShortcutListStyle & __ESLW_INV_VFONT) == 0 ) ? sizeTextMeasured.cx/2 : - sizeTextMeasured.cx/2 + 2 , 0 ); CPoint ptCenter = rcCaption.CenterPoint(); if( (_pslid.m_dwShortcutListStyle & __ESLW_INV_VFONT) == 0 ) ptCenter.y = rcCaption.bottom - 4 - (rcCaption.Height() - sizeTextMeasured.cy) ; else ptCenter.y = rcCaption.top + 4 ; dc.ExtTextOut( ptCenter.x, ptCenter.y, ETO_CLIPPED, &rcCaption, sItemText, sItemText.GetLength(), NULL ); dc.SetTextAlign( nOldTA ); } // if( _pslid.m_bHorzLayout ) else { CRect rcClient( _pslid.m_rcCtrlClient ); rcClient.DeflateRect( 1, 0 ); CRect rcText( max(rcCaption.left, rcClient.left), rcCaption.top, min(rcCaption.right, rcClient.right), rcCaption.bottom ); if( rcText.left < rcText.right ) { UINT nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS; dc.DrawText( sItemText, nItemTextLen, &rcText, nFormat ); } // if( rcText.left < rcText.right ) } // else from if( _pslid.m_bHorzLayout ) dc.SetBkMode( nOldBkMode ); dc.SetTextColor( clrTextOld ); dc.SelectObject( pOldFont ); } } #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL) COLORREF CExtPaintManager::GetShadowAdjustColor() { return ((COLORREF)(-1)); } COLORREF CExtPaintManagerXP::GetShadowAdjustColor() { return ((COLORREF)(-1)); } COLORREF CExtPaintManagerOffice2003::GetShadowAdjustColor() { if( g_PaintManager.m_bUxApiInitPassed && g_PaintManager.m_bUxValidColorsExtracted && g_PaintManager.m_bUxUseIfAvailOnWinXpOrLater ) { return g_PaintManager.m_clrUxTaskBandFillColorHint; } return ((COLORREF)(-1)); } void CExtPaintManager::FixedBar_AdjustClientRect( CExtControlBar * pBar, CRect & rcPreCalc ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); if( pBar->IsDockedVertically() ) rcPreCalc.DeflateRect( __EXT_TB_ROW_DISTANCE/4, __EXT_TB_ROW_DISTANCE/2 ); else rcPreCalc.DeflateRect( __EXT_TB_ROW_DISTANCE/2, __EXT_TB_ROW_DISTANCE/4 ); } void CExtPaintManagerXP::FixedBar_AdjustClientRect( CExtControlBar * pBar, CRect & rcPreCalc ) { CExtPaintManager::FixedBar_AdjustClientRect( pBar, rcPreCalc ); } void CExtPaintManagerOffice2003::FixedBar_AdjustClientRect( CExtControlBar * pBar, CRect & rcPreCalc ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); if( stat_GetBPP() <= 8 ) { CExtPaintManagerXP::FixedBar_AdjustClientRect( pBar, rcPreCalc ); if( pBar->IsDockedVertically() ) rcPreCalc.InflateRect( 0, 2 ); else rcPreCalc.InflateRect( 2, 0 ); } } INT CExtPaintManager::FixedBar_GetRowDistance( CExtToolControlBar * pBar ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); if( pBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) ) return 0; return __EXT_TB_ROW_DISTANCE; } INT CExtPaintManagerXP::FixedBar_GetRowDistance( CExtToolControlBar * pBar ) { return CExtPaintManager::FixedBar_GetRowDistance( pBar ); } INT CExtPaintManagerOffice2003::FixedBar_GetRowDistance( CExtToolControlBar * pBar ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); if( ( (! pBar->IsFloating() ) // && pBar->OnQueryMultiRowLayout() ) || pBar->m_bPaletteMode || stat_GetBPP() <= 8 ) return CExtPaintManagerXP::FixedBar_GetRowDistance( pBar ); return 0; } bool CExtPaintManager::FixedBar_IsPaintRowBkMode( CExtToolControlBar * pBar ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); pBar; return false; } bool CExtPaintManagerXP::FixedBar_IsPaintRowBkMode( CExtToolControlBar * pBar ) { return CExtPaintManager::FixedBar_IsPaintRowBkMode( pBar ); } bool CExtPaintManagerOffice2003::FixedBar_IsPaintRowBkMode( CExtToolControlBar * pBar ) { ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( pBar->IsFixedMode() ); if( pBar->m_pDockSite == NULL || pBar->m_bPresubclassDialogMode || pBar->m_bPaletteMode || pBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) || pBar->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) ) || (! pBar->IsFloating() ) || stat_GetBPP() <= 8 ) return false; return true; } void CExtPaintManager::PaintFloatToolbarRowBk( CDC & dc, CExtToolControlBar * pBar, int nLastReviewBtnIdx, CRect & rcRowBk ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( nLastReviewBtnIdx >= 0 ); dc; pBar; nLastReviewBtnIdx; rcRowBk; } void CExtPaintManagerXP::PaintFloatToolbarRowBk( CDC & dc, CExtToolControlBar * pBar, int nLastReviewBtnIdx, CRect & rcRowBk ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( nLastReviewBtnIdx >= 0 ); dc; pBar; nLastReviewBtnIdx; rcRowBk; } void CExtPaintManagerOffice2003::PaintFloatToolbarRowBk( CDC & dc, CExtToolControlBar * pBar, int nLastReviewBtnIdx, CRect & rcRowBk ) { ASSERT( dc.GetSafeHdc() != NULL ); ASSERT_VALID( pBar ); ASSERT_KINDOF( CExtToolControlBar, pBar ); ASSERT( nLastReviewBtnIdx >= 0 ); pBar; nLastReviewBtnIdx; COLORREF clrTop = GetColor( _2003CLR_MLA_NORM_RIGHT ); COLORREF clrBottom = GetColor( _2003CLR_SEPARATOR_LIGHT ); stat_PaintGradientRect( dc, rcRowBk, clrTop, clrBottom, true ); } void CExtPaintManager::OnSysColorChange() { OnPaintSessionComplete( this ); SyncSysColors(); InitTranslatedColors(); } void CExtPaintManager::OnSettingChange( UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection ) { uFlags; lpszSection; OnPaintSessionComplete( this ); SyncSysColors(); InitTranslatedColors(); } void CExtPaintManager::OnDisplayChange( INT nDepthBPP, CPoint ptSizes ) { nDepthBPP; ptSizes; OnPaintSessionComplete( this ); SyncSysColors(); InitTranslatedColors(); } void CExtPaintManager::OnThemeChanged( WPARAM wParam, LPARAM lParam ) { wParam; lParam; OnPaintSessionComplete( this ); SyncSysColors(); InitTranslatedColors(); } void CExtPaintManager::OnPaintSessionComplete( CObject * pHelperSrc, LPARAM lParam // = 0L ) { #ifdef __TRACE_PAINT_SESSIONS TRACE( " PAINT_SESSION: Complete\n" ); #endif // __TRACE_PAINT_SESSIONS pHelperSrc; lParam; CachedDcFreeAll(); } void CExtPaintManagerXP::OnPaintSessionComplete( CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManager::OnPaintSessionComplete( pHelperSrc, lParam ); } void CExtPaintManagerOffice2003::OnPaintSessionComplete( CObject * pHelperSrc, LPARAM lParam // = 0L ) { CExtPaintManagerXP::OnPaintSessionComplete( pHelperSrc, lParam ); } CSize CExtPaintManager::GetToolBarRgnRoundersSize() { return CSize( 0, 0 ); } CSize CExtPaintManagerXP::GetToolBarRgnRoundersSize() { return CSize( 0, 0 ); } CSize CExtPaintManagerOffice2003::GetToolBarRgnRoundersSize() { return m_sizeToolBarRgnRounders; } CExtPaintManager::PAINTTOOLBARTEXTFIELDDATA::PAINTTOOLBARTEXTFIELDDATA() : m_pHelperSrc( NULL ) , m_lParam( 0L ) , m_nDrawTextFlags( DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX ) , m_sText( _T("") ) , m_rcButton( 0, 0, 0, 0 ) , m_rcTextField( 0, 0, 0, 0 ) , m_bComboField( false ) , m_bHover( false ) , m_bPushed( false ) , m_bEnabled( false ) { } CExtPaintManager::PAINTTOOLBARTEXTFIELDDATA::PAINTTOOLBARTEXTFIELDDATA( CObject * pHelperSrc, __EXT_MFC_SAFE_LPCTSTR sText, const RECT & rcButton, const RECT & rcTextField, bool bComboField, bool bHover, bool bPushed, bool bEnabled ) : m_pHelperSrc( pHelperSrc ) , m_lParam( 0L ) , m_nDrawTextFlags( DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX ) , m_sText( (sText == NULL) ? _T("") : sText ) , m_rcButton( rcButton ) , m_rcTextField( rcTextField ) , m_bComboField( bComboField ) , m_bHover( bHover ) , m_bPushed( bPushed ) , m_bEnabled( bEnabled ) { } void CExtPaintManager::PaintToolbarTextField( CDC & dc, PAINTTOOLBARTEXTFIELDDATA & _ptbtfd ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); if( _ptbtfd.m_bComboField ) { PAINTCOMBOFRAMEDATA _pcfd( _ptbtfd.m_pHelperSrc, _ptbtfd.m_rcButton, _ptbtfd.m_bHover, _ptbtfd.m_bPushed, _ptbtfd.m_bEnabled ); _pcfd.m_bNoTopOuterBorder = true; PaintComboFrame( dc, _pcfd ); dc.SelectClipRgn( NULL ); } // if( _ptbtfd.m_bComboField ) else { if( _ptbtfd.m_bEnabled && (_ptbtfd.m_bHover || _ptbtfd.m_bPushed) ) dc.Draw3dRect( &_ptbtfd.m_rcButton, GetColor( COLOR_3DSHADOW ), GetColor( COLOR_3DHIGHLIGHT ) ); } // else from if( _ptbtfd.m_bComboField ) dc.FillSolidRect( &_ptbtfd.m_rcTextField, GetColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) ); if( !_ptbtfd.m_sText.IsEmpty() ) { COLORREF clrTextOld = dc.SetTextColor( GetColor(COLOR_BTNTEXT) ); CFont * pFontOld = dc.SelectObject( &m_FontNormal ); int nBkModeOld = dc.SetBkMode( TRANSPARENT ); CRect rcText( _ptbtfd.m_rcTextField ); rcText.left += 5; rcText.top += 2; dc.DrawText( _ptbtfd.m_sText, _ptbtfd.m_sText.GetLength(), &rcText, _ptbtfd.m_nDrawTextFlags ); dc.SetBkMode( nBkModeOld ); dc.SelectObject( pFontOld ); dc.SetTextColor( clrTextOld ); } // if( !_ptbtfd.m_sText.IsEmpty() ) } void CExtPaintManagerXP::PaintToolbarTextField( CDC & dc, PAINTTOOLBARTEXTFIELDDATA & _ptbtfd ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); if( _ptbtfd.m_bComboField ) { CExtPaintManager::PaintToolbarTextField( dc, _ptbtfd ); return; } if( _ptbtfd.m_bEnabled && (_ptbtfd.m_bHover || _ptbtfd.m_bPushed) ) { COLORREF clrDkBorder = GetColor( XPCLR_HILIGHT_BORDER ); CRect rcTextFieldOuter( _ptbtfd.m_rcTextField ); rcTextFieldOuter.InflateRect( 1, 1 ); dc.Draw3dRect( &rcTextFieldOuter, clrDkBorder, clrDkBorder ); } // if( _ptbtfd.m_bEnabled && (_ptbtfd.m_bHover || _ptbtfd.m_bPushed) ) dc.FillSolidRect( &_ptbtfd.m_rcTextField, GetColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) ); if( !_ptbtfd.m_sText.IsEmpty() ) { COLORREF clrTextOld = dc.SetTextColor( GetColor(COLOR_BTNTEXT) ); CFont * pFontOld = dc.SelectObject( &m_FontNormal ); int nBkModeOld = dc.SetBkMode( TRANSPARENT ); CRect rcText( _ptbtfd.m_rcTextField ); rcText.left += 5; rcText.top += 2; dc.DrawText( _ptbtfd.m_sText, _ptbtfd.m_sText.GetLength(), &rcText, _ptbtfd.m_nDrawTextFlags ); dc.SetBkMode( nBkModeOld ); dc.SelectObject( pFontOld ); dc.SetTextColor( clrTextOld ); } // if( !_ptbtfd.m_sText.IsEmpty() ) } COLORREF CExtPaintManager::GetIconAlphaColor() const { return (COLORREF(-1L)); // not alpha icon effect } COLORREF CExtPaintManagerXP::GetIconAlphaColor() const { return (COLORREF(-1L)); // not alpha icon effect } COLORREF CExtPaintManagerOffice2003::GetIconAlphaColor() const { COLORREF clrAlpha = ( const_cast < CExtPaintManagerOffice2003 * > ( this ) ) -> GetColor( COLOR_3DFACE ); return clrAlpha; } double CExtPaintManager::GetIconAlphaAdjustPercent() const { return 0.0; // no alpha adjustment } double CExtPaintManagerXP::GetIconAlphaAdjustPercent() const { return 0.0; // no alpha adjustment } double CExtPaintManagerOffice2003::GetIconAlphaAdjustPercent() const { return 0.70; // 70% enlighten } void CExtPaintManager::PaintResizingGripper( CDC &dc, const RECT & rcGrip, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( rcGrip.left > rcGrip.right || rcGrip.top > rcGrip.bottom || ( ! dc.RectVisible(&rcGrip) ) ) return; CFont * pOldFont = dc.SelectObject( &m_FontMarlett ); ASSERT( pOldFont != NULL ); COLORREF clrOld = dc.SetTextColor( GetColor( CExtPaintManager::CLR_TEXT_OUT ) ); INT nOldBkMode = dc.SetBkMode(TRANSPARENT); dc.DrawText( _T("o"), 1, (LPRECT)&rcGrip, DT_SINGLELINE|DT_RIGHT|DT_BOTTOM ); dc.SetBkMode(nOldBkMode); dc.SetTextColor(clrOld); dc.SelectObject(pOldFont); } void CExtPaintManagerXP::PaintResizingGripper( CDC &dc, const RECT & rcGrip, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); CExtPaintManager::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam ); } void CExtPaintManagerOffice2003::PaintResizingGripper( CDC &dc, const RECT & rcGrip, CObject * pHelperSrc, LPARAM lParam // = 0L ) { ASSERT_VALID( this ); ASSERT( dc.GetSafeHdc() != NULL ); pHelperSrc; lParam; if( stat_GetBPP() <= 8 ) { CExtPaintManagerXP::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam ); return; } COLORREF clrDotShadow = GetColor( _2003CLR_GRIPPER_DOT_LIGHT ); COLORREF clrDotFace = GetColor( _2003CLR_GRIPPER_DOT_DARK ); static const CSize g_sizeGripDot( 2, 2 ); static const CSize g_sizeGripDist( 1, 1 ); static const CSize g_sizeGripShadowOffset( 1, 1 ); CRect rcDotFace( CPoint(rcGrip.right, rcGrip.bottom), g_sizeGripDot ); rcDotFace.OffsetRect( -g_sizeGripDot ); CRect rcDotShadow( rcDotFace ); rcDotFace.OffsetRect( -g_sizeGripShadowOffset ); CRect rcDotFaceSave( rcDotFace ); CRect rcDotShadowSave( rcDotShadow ); int nStepH = -(g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx); int nStepV = -(g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy); for( int nDot = 0; nDot < 3; nDot++ ) { dc.FillSolidRect( &rcDotShadow, clrDotShadow ); dc.FillSolidRect( &rcDotFace, clrDotFace ); rcDotFace.OffsetRect( 0, nStepV ); rcDotShadow.OffsetRect( 0, nStepV ); } // for( int nDot = 0; nDot < nDotCount; nDot++ ) rcDotFace = rcDotFaceSave; rcDotShadow = rcDotShadowSave; rcDotFace.OffsetRect( nStepH, 0 ); rcDotShadow.OffsetRect( nStepH, 0 ); for( nDot = 0; nDot < 2; nDot++ ) { dc.FillSolidRect( &rcDotShadow, clrDotShadow ); dc.FillSolidRect( &rcDotFace, clrDotFace ); rcDotFace.OffsetRect( 0, nStepV ); rcDotShadow.OffsetRect( 0, nStepV ); } // for( nDot = 0; nDot < 2; nDot++ ) rcDotFace = rcDotFaceSave; rcDotShadow = rcDotShadowSave; rcDotFace.OffsetRect( nStepH*2, 0 ); rcDotShadow.OffsetRect( nStepH*2, 0 ); dc.FillSolidRect( &rcDotShadow, clrDotShadow ); dc.FillSolidRect( &rcDotFace, clrDotFace ); }